GIT如何修改author date和commiter date

新手上路,请多包涵

需要使用gitlab的merge request方式,在尝试new Merge Request时gitlab页面报错,经过查看gitlab后台日志,显示
“Rugged::OdbError (Failed to parse commit aef3846d6401d68asdfsdf281c39cb584b812d - cannot parse commit time):
app/services/compare_service.rb:11:in `new'
app/services/compare_service.rb:11:in `execute'
app/controllers/projects/compare_controller.rb:13:in `show'”

看了这个commit ,author_date和commiter_date是2099年(没错,这个项目之前是开放修改的,开发人员为了自测改了本地日期,commit时忘了改回来了)。总之,这个项目上有一些commit都是这两个日期在当前日期之后的,估计是这个日期影响了compare,现在尝试把它们改回来。

查看了很多资料,觉得git filter-branch应该能够解决这个问题,尝试了如下脚本:

git filter-branch -f --env-filter '
   if [ $GIT_COMMIT = aef3846d6401d68asdfsdf281c39cb584b812d ]
   then
       export GIT_AUTHOR_DATE="Mon Jun 25 14:13:00 CST 2018"
       export GIT_COMMITER_DATE="Mon Jun 25 14:13:00 CST 2018"
   fi'     

然而并没有起作用,脚本正常运行完,日期还是没有变化。
有没有处理过类似问题的兄弟望赐教!

阅读 6.3k
2 个回答
✓ 已被采纳新手上路,请多包涵

自己来答吧,最后选用了这个办法:

git rebase -i xxxxxx^

其中xxxxxx是错误的提交的commit_hash,然后在出现的pick编辑器中,将xxxxxx前面的pick改为edit;
这样在做rebase时,遇到指定的commit,会停住进行交互,执行下面命令对commit进行编辑:

GIT_COMMITTER_DATE='2018-07-12 00:00:00' GIT_AUTHOR_DATE='2018-07-12 00:00:00' git commit --amend --no-edit --date '2018-07-12 00:00:00'

修改commit的日期,然后git rebase --continue

完成rebase后 git push --force

说起来简单,实际实现起来,由于提交历史太多了,几千条,其中日期错误的零零散散几十条,所以git rebase -i 的时候选取最早一次出现的错误commit,然后在编辑器里把需要修改日期的commit都改为edit,再进行交互,由于可能有合并冲突的,可能有新增文件的需要git add .的,几千条中需要不停的人机交互......

又捣鼓了很长时间,用java写了个程序,执行shell命令,根据命令的不同的输出进行不同的输入,还在测试中,就不展开说了。

我也遇到了同样的情况,需要对版本库中的大量提交进行时间修改。

我的解决方法是这样的,可以参考,执行一个批处理文件:

@echo off

git log --reverse --format="%%H %%aI" > git-log.txt
git-log.txt
pause

for /f "tokens=1,2" %%i in (git-log.txt) do (
    if not defined first (
        set first=1
        git reset --hard %%i
    ) else (
        git cherry-pick %%i
    )
    set GIT_COMMITTER_DATE=%%j
    git commit --amend --no-edit --quiet --date=%%j
    echo ----------
)
pause

其中第一个puase之前,将版本库中的hashdate输出到了git-log.txt

然后在打开的git-log.txt中对文本中的日期作出原位修改。

然后批处理文件继续运行,可reset到第一条hash的位置,然后用git commit --amendAuthor DateCommiter Date进行修改。后面的提交用cherry-pick以及amend进行提交和修改。

注意reset的批处理进行之前,需要将仓库中的修改stash贮存,并保证其他文件不会在历史版本中产生可能的合并冲突!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进