我将旧的CVS存储库转换为git,除了所有提交都是UTC而不是每个作者的本地时区之外,git工作得非常好。
我想基于每个作者更改这些提交的时区,因此例如来自一个作者的所有提交从+0000变为+1000,而来自其他作者的提交不变。 (所以我可以为每位作者执行一次此程序。)
实际的时刻应该保持不变,因此当前02:00:00 +0000
的提交应该变为12:00:00 +1000
。
是否可以使用git filter-branch
?
答案 0 :(得分:3)
除了@Malvineous'回答:
如果可以使用当前用户的时区作为参考,则可以使用Git进行DST转换。这对我来说很成功,将所有提交的时区修复到当前时区,包括DST更改。
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" == "email@example.com" ]; then
GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE|sed -e "s/[+-][0-9]\{4\}//g"`
fi
if [ "$GIT_COMMITTER_EMAIL" == "email@example.com" ]; then
GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE|sed -e "s/[+-][0-9]\{4\}//g"`
fi
'
sed
行剥离了时区。 Gt负责其余的工作。
请注意,这不支持最初请求的显式时区,但需要处理DST。
注意:强>
原始答案使用date
添加了一行,例如,
GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE`
但是,这不是必需的,因为当没有指定时,句柄使用当前时区(包括DST)。因此,切割时区就足够了。
答案 1 :(得分:2)
我想出了这个,似乎可以解决这个问题:
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" == "email@example.com" ]; then
export GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE | sed s/+0000/+1000/`
fi
if [ "$GIT_COMMITTER_EMAIL" == "email@example.com" ]; then
export GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE | sed s/+0000/+1000/`
fi'
这会将作者email@example.com
的时区从+0000
更改为+1000
。如果时区已经是给定提交中的其他内容,那么它将保持不变。如果此人是作者但不是提交者(反之亦然),则只更新其角色的日期。
@MattJohnson指出,它不会处理因DST而导致的UTC偏移变化,但如果需要,也许你可以为此添加额外的标准。
这可以通过利用git的内部日期格式来实现,该格式始终以自纪元以来的秒数开始测量,看起来像@12345 +0000
。此处的时区未使用(秒数始终为UTC),允许您在不更改引用的有效时刻的情况下更改时区。此处更改UTC偏移仅影响日期的默认格式。