更改git历史记录中所有提交的时区

时间:2015-06-21 00:26:56

标签: git timezone git-filter-branch

我将旧的CVS存储库转换为git,除了所有提交都是UTC而不是每个作者的本地时区之外,git工作得非常好。

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

实际的时刻应该保持不变,因此当前02:00:00 +0000的提交应该变为12:00:00 +1000

是否可以使用git filter-branch

之类的内容

2 个答案:

答案 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偏移仅影响日期的默认格式。