如何在filter-branch之后删除旧的提交?

Ida*_*n K 4 git

我使用filter-branch来修复我的存储库中不正确的电子邮件地址,但所有分支现在都是MIA(除了master).

这是git graph之前显示的filter-branch:

*   d93c7ee (HEAD, master) Merge branch 'f1'
|\  
| * 08e7463 (f1) adding b
|/  
* 7c7bd91 adding a
Run Code Online (Sandbox Code Playgroud)

我发出了这个filter-branch命令:

git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL="fixed-email";
                                GIT_AUTHOR_NAME="fixed-author"'
Run Code Online (Sandbox Code Playgroud)

得到了这个:

*   770262a (HEAD, master) Merge branch 'f1'
|\  
| * 0f58ab5 adding b
|/  
* fb012a9 adding a
*   d93c7ee (refs/original/refs/heads/master) Merge branch 'f1'
|\  
| * 08e7463 (f1) adding b
|/  
* 7c7bd91 adding a
Run Code Online (Sandbox Code Playgroud)

一些困扰我的事情:

1)f1分支未移至0f58ab5.
2)fb012a9之前的所有提交似乎与我无关,我可以摆脱它们吗?

我在另一个问题中看到有人建议:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)

但它没有太大帮助,这是我后来得到的:

*   770262a (HEAD, master) Merge branch 'f1'
|\  
| * 0f58ab5 adding b
|/  
* fb012a9 adding a
* 08e7463 (f1) adding b
* 7c7bd91 adding a
Run Code Online (Sandbox Code Playgroud)

编辑:做VonC提出的建议产生了这个图:

*   211632d (HEAD, master) Merge branch 'f1'
|\  
| * bda7577 (f1) adding b
|/  
* 70c7b34 adding a
*   3182b33 (refs/original/refs/heads/master) Merge branch 'f1'
|\  
| * 8b81c21 (refs/original/refs/heads/f1) adding b
|/  
* 4c07dc9 adding a
Run Code Online (Sandbox Code Playgroud)

这解决了问题#1,现在我只需要找到摆脱旧提交的方法,我该如何实现呢?

Von*_*onC 6

你可以再试一次你的git filter-branch,最后是' -- --all',例如:

git filter-branch --env-filter 'export GIT_AUTHOR_EMAIL="fixed-email";
                                       GIT_AUTHOR_NAME="fixed-author"' -- --all
Run Code Online (Sandbox Code Playgroud)

注意:

  • --用于分隔修订选项过滤器分支选项,
  • --all重写所有分支和标签.

也就是说,在你目前的情况下,没有多少git gc ... prune ...会删除仍然由分支标记引用的提交,如f1仍然指向的那样08e7463.
所以你所看到的是正常的设计.


OP报告说,一旦完成git filter-branch ... -- --all,rm -r .git/refs/original就会处理旧的提交.

同样,这并不奇怪:没有标签或分支不再引用它们,这次意味着它们是从Git仓库中永久删除的候选者.