我不得不在git repo上应用filter-branch,由于某种原因,似乎已经与旧的哈希合并,这导致每个文件的树看起来像这样:
-. .--A--B--C-....-X--Y--Z
\--A'-B'-C'-...-X'
带有素数的提交字母是相应字母的副本,只是使用不同的SHA1哈希值。 在应用了filter-branch之后一直有提交,这使得很难重做filter-branch(图中的Y,Z),所以我的问题是,有没有办法删除重复的提交?
编辑:更新了树的布局,注意到这两条路径并没有真正共享一个共同的祖先。
答案 0 :(得分:0)
使用您当前的设置,将分支指向Z.不要在A',B',C',X'提交。
Git将负责其余部分。
快乐的Gitting!
答案 1 :(得分:0)
您应该将分支指向提交Z
,并删除任何指向A'
到X'
的分支/标记。然后,提交对象A'
到X'
将无法从任何引用(例如分支和标记)访问,但只能reflog
。并且reflog
有到期时间。在reflog
到期后,它们将成为真正无法访问的对象,默认为90天。 git gc
将自动删除这些无法访问的对象。您无需关心它,因为git
会自动处理。
PS。所有这些行为实际上都是可配置的。有关详细信息,请参阅http://git-scm.com/docs/git-gc。
[更新] 以下是删除无法访问的提交对象的步骤。
查看仅A'
引用的提交对象X'
到reflog
。
git fsck --unreachable --no-reflogs
然后,您可以使用git reflog expire
删除相关的reflog
并使其真正无法访问。
git reflog expire --expire-unreachable=now --all
现在,您可以使用以下命令显示无法访问的对象。
git fsck --unreachable
要删除这些无法访问的对象,只需运行git prune
。
git prune
您还可以使用git gc
删除这些无法访问的对象。它会同时打包物品。
git gc --prune=now
答案 2 :(得分:0)
我没有在图表中看到合并。
当你运行filter-branch时,git会自动将它处理的所有refs的副本复制到refs / original /。在git gc
核对原始提交之前,您需要删除所有这些引用并过期reflog。