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

Change timezone for all commits in git history

我正在将一个旧的 CVS 存储库转换为 git,除了所有提交都使用 UTC 而不是每个作者的本地时区外,它运行良好。

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

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

这可以用 git filter-branch 吗?

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

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 指出的那样,它不会处理由于夏令时而导致的更改 UTC 偏移量,但如果需要,您也许可以为此添加其他条件。

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

除了@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
'

sed 行去掉了时区。 GIt 处理剩下的事情。

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

注意: 原始答案使用 date 增加了一行,例如

GIT_AUTHOR_DATE=`date --date=$GIT_AUTHOR_DATE`

但是,这不是必需的,因为在指定 none 时 handles 使用当前时区(包括 DST)。因此,切掉时区就足够了。