更改 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)。因此,切掉时区就足够了。
我正在将一个旧的 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)。因此,切掉时区就足够了。