我一直在寻找将回购中所有先前提交移至以后日期的方法。到目前为止,我发现的是
`git filter-branch --env-filter
'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
then
export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
fi'`
但是,如果我正在逐个提交,这很好。但是,是否有一种方法可以遍历存储库中的所有提交,并在一年后自动移动它,而不是手动移动大量提交?谢谢。
编辑:只是为了使人们不要因为这是不好的做法而对它投下反对票,我这样做的原因是尝试使用github的贡献图/图表。这是一个只有一个用户且没有其他贡献者的个人回购。
答案 0 :(得分:1)
重写Git历史记录的通常建议适用于此处-您的历史记录将不再与存储库的其他副本匹配,您必须强行推送,但是强行推送很危险,因此您应该--force-push-with-lease
,依此类推。不要在这里质疑您的动机,因为我认为众所周知,第三方的未签名Git历史很容易被伪造-您也可以将想要的任何作者微不足道地放入Git历史中。就个人而言,我对可以从我的GitHub帐户中删除我的个人习惯和唤醒/睡眠周期感到不满意,因此我可以理解清理数据的愿望。
最困难的部分是在shell脚本中正确处理日期。过滤器中的日期将以date +'@%s %z'
给出的格式给出,例如@1536176083 -0400
可能是值之一。问题在于,此时实际上甚至不可能实现“四个月后”之类的日历算法,因为如果不知道原始时区是什么,我们就无法知道四个月后的正确时区偏移量是多少。换句话说,Git只是不存储时区,因此,如果要保留时区,则必须对其进行重构,这很困难。
我们 所能做的很容易,就是通过添加或减去几秒钟来修改时间戳,然后将所有内容都放在本地时区中。例如,
git filter-branch --env-filter '
set $GIT_COMMITTER_DATE
GIT_COMMITTER_DATE=@$((${1#@} + 24*60*60))
set $GIT_AUTHOR_DATE
GIT_AUTHOR_DATE=@$((${1#@} + 24*60*60))
'
这会将提交重写为原始值之后的第一天(24*60*60
是第二天)。时区将是所有内容的本地时区。如果要保留原始提交的时区,这将成为一个更加困难的问题,可能需要更多的人工干预。
如果要选择特定的时区,可以在运行Git时设置TZ
环境变量。