2015-06-21 179 views
5

我正在将旧的CVS存储库转换为git,除非所有提交都是UTC,而不是每个作者的本地时区,否则它工作得很好。更改git历史记录中所有提交的时区

我想在每个作者的基础上更改这些提交的时区,例如,来自一位作者的所有提交从+0000改为+1000,而来自其他作者的提交保持不变。 (所以我可以为每个作者执行一次这个过程。)

实际时间应该保持不变,所以当前02:00:00 +0000的提交应该变为12:00:00 +1000

这是可能的东西像git filter-branch

+1

不要忘记“时区!=偏移”(请参阅​​[时区标记wiki](http://stackoverflow.com/tags/timezone/info))。取决于DST,单个作者的偏移量可能会有所不同。 –

+0

相关:http:// stackoverflow。com/a/23900181/634824 –

回答

1

我来到了这一点,这似乎这样的伎俩:

git filter-branch --env-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" == "[email protected]" ]; then 
     export GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE | sed s/+0000/+1000/` 
    fi 
    if [ "$GIT_COMMITTER_EMAIL" == "[email protected]" ]; then 
     export GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE | sed s/+0000/+1000/` 
    fi' 

这将改变从+0000+1000时区作者[email protected]。如果时区在给定提交中已经是别的东西,那么它将保持不变。如果此人是作者而不是提交者(反之亦然),则只更新其角色的日期。

它不会像@MattJohnson指出的那样处理由DST引起的UTC偏移量的变化,但是如果需要的话,您可以添加其他标准。

这是通过利用git的内部日期格式,它始终以秒为单位测量,并且看起来像@12345 +0000。此处的时区未使用(秒数总是以UTC表示),它允许您更改时区而不更改正在引用的有效时刻。在这里更改UTC偏移仅影响日期的默认格式。

2

除了@Malvineous'回答:

如果它的好使用当前用户的时区作为参考,还可以使用Git做DST转换。这对我来说是个诀窍,将所有提交的时区固定到当前时区,包括DST更改。

git filter-branch --env-filter ' 
    if [ "$GIT_AUTHOR_EMAIL" == "[email protected]" ]; then 
    GIT_AUTHOR_DATE=`echo $GIT_AUTHOR_DATE|sed -e "s/[+-][0-9]\{4\}//g"` 
    fi 
    if [ "$GIT_COMMITTER_EMAIL" == "[email protected]" ]; then 
    GIT_COMMITTER_DATE=`echo $GIT_COMMITTER_DATE|sed -e "s/[+-][0-9]\{4\}//g"` 
    fi 
' 

sed线剥离时区。 GIt负责其余部分。

请注意,这不支持最初请求的显式时区,但会照顾DST。

注: 原答案使用date,例如,

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE` 

然而,由于手柄使用当前时区(包括DST)没有指定时,这是没有必要有一个附加的线。因此,切断时区就足够了。

+0

不知道这里的“DST转换”是什么意思,但是当我在TZ = Europe/London的冬天跑它时,它将所有时间都转换为UTC(+0000),并没有处理这个事实去年夏天伦敦正在使用英国夏令时的一些承诺。 (我一直在尝试整理一个我从美国服务器上提交的存储库,该服务器设置为美国时区,我宁愿将我在本地的英国时间记录在提交上。) –

相关问题