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

Mal*_*ous 8 git timezone git-filter-branch

我正在将旧的CVS存储库转换为git,除了所有提交都是UTC而不是每个作者的本地时区之外,它已经很好地工作了.

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

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

这有可能git filter-branch吗?

Mal*_*ous 5

我想出了这个,这似乎可以解决问题:

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'
Run Code Online (Sandbox Code Playgroud)

这会将作者的时区email@example.com从更改+0000+1000。如果时区已经是给定提交中的其他内容,那么它将保持不变。如果此人是作者而非提交者(或反之亦然),则只会更新其角色的日期。

正如@MattJohnson 指出的那样,它不会处理由于夏令时而改变的 UTC 偏移量,但也许您可以根据需要为此添加其他标准。

这是通过利用 git 的内部日期格式来实现的,该格式始终以自纪元以​​来的秒数为单位进行测量,看起来像@12345 +0000. 此处未使用时区(秒数始终采用 UTC),这允许您更改时区而不更改所引用的有效时刻。在此处更改 UTC 偏移量只会影响日期的默认格式。


小智 5

除了@Malvineous 的回答:

如果可以使用当前用户的时区作为参考,可以使用Git进行夏令时转换。这对我有用,将所有提交的时区修复为当前时区,包括 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
'
Run Code Online (Sandbox Code Playgroud)

sed行剥离了时区。GIt 负责其余的工作。

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

注意: 原始答案有额外的行使用date,例如,

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE`
Run Code Online (Sandbox Code Playgroud)

但是,这不是必需的,因为当没有指定时,句柄使用当前时区(包括 DST)。因此,砍掉时区就足够了。