git duplicate parent导致一半的历史记录消失

时间:2013-03-01 16:00:57

标签: git git-filter-branch

我运行了git filter-branch来重命名我的git存储库中的一些作者,我得到了:

$ git log --oneline | wc -l
665
$ ./git-rename-author.rb "First Last" new-email@email.com old-email@email.com
Rewrite 453a72b4f690620c04fce80a0aa237b9dee7038f (653/665)error: duplicate parent f61ea265c9069723f58557c55d3efae450ab2bd0 ignored
Rewrite 566c89fd59cf7e5c2992ee11adbf876343dc4a85 (665/665)
$ git log --oneline | wc -l
339

所以整个我从665提交开始,我以339结束。

查看git - duplicate parent答案,似乎git filter-branch应解决重复问题。分辨率是什么?是否有326次重复提交?

提前谢谢。

修改:这是我运行的git filter-branch脚本。这是一个简单的Ruby脚本,可以将多个电子邮件地址重命名为一个用户。

#!/usr/bin/env ruby

ARGV[2].split(',').each do |old_email|
  puts "Renaming #{old_email} to #{ARGV[0]} <#{ARGV[1]}>"

  env_filter = <<-EOS
  '
  an="$GIT_AUTHOR_NAME"
  am="$GIT_AUTHOR_EMAIL"
  cn="$GIT_COMMITTER_NAME"
  cm="$GIT_COMMITTER_EMAIL"

  if [ "$GIT_AUTHOR_EMAIL" = "#{old_email}" ]
  then
      an="#{ARGV[0]}"
      am="#{ARGV[1]}"
  fi
  if [ "$GIT_COMMITTER_EMAIL" = "#{old_email}" ]
  then
      cn="#{ARGV[0]}"
      cm="#{ARGV[1]}"
  fi

  export GIT_AUTHOR_NAME="$an"
  export GIT_AUTHOR_EMAIL="$am"
  export GIT_COMMITTER_NAME="$cn"
  export GIT_COMMITTER_EMAIL="$cm"
  '
  EOS

  system "git filter-branch -f --env-filter #{env_filter}"
end

1 个答案:

答案 0 :(得分:3)

您可能已经拥有两次具有相同父级的提交;没有指定过滤器的git filter-branch会检测到并修复它。在进行任何作者更改之前,请先尝试这一点。

您可能还提交了一对父级,这些父级目前是不同的,但在您的filter-branch脚本转换后将完全相同。如果您的filter-branch命令是正确的,那么您没有丢失任何工作 - 您在历史记录中只有一组并行的重写前提交,现在已统一。