我使用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,现在我只需要找到摆脱旧提交的方法,我该如何实现呢?
你可以再试一次你的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仓库中永久删除的候选者.