我开始胡闹git filter-branch
。 --all 选项重写所有分支和标签。凉爽的。git filter-branch
创建它在 refs/original 中覆盖的所有引用的备份。很酷。现在我想毁掉我所有的实验filter-branch
away.
有没有一种简单的方法可以完全消除影响git filter-branch <whatever filter> -- --all
? IE。将所有重写的分支一次性恢复到原始状态?
如果没有预先存在的方法,那么应该有。如果没有预先存在的方法,是否有人有一个简短的脚本可以做到这一点?
显然有解决方法。我可以手动恢复它,一次一个分支,如下所示这个问题 https://stackoverflow.com/questions/14542326/undo-git-filter-branch。或者我可以直接用核武器攻击并重新克隆。在具有许多分支/标签(例如)被分割成更小的存储库的存储库中,这两种方法都会很快变得乏味。
这是撤消过滤器分支的简单而安全的方法:
git fetch . +refs/original/*:*
如果当前签出的分支(HEAD
) 是要恢复的分支之一,此命令将失败。你可以运行git checkout --detach
事先让git fetch
更新所有分支。运行后记得签出分支git fetch
!
成功恢复参考后,您可以删除refs/original
使用此命令安全地引用:
git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin
旧答案:
git for-each-ref refs/heads refs/tags \
--format='git update-ref "%(refname)" "%(refname)@{1 hour ago}"'
为了增加安全性,您可以测试过滤器分支是否确实更新了引用:
git for-each-ref refs/heads refs/tags --format='
{ git reflog -1 "%(refname)" | sed -n "/filter-branch: rewrite$/Q1"; } \
|| git update-ref -m "reset to before filter-branch" \
%(refname) %(refname)@{1}' | sh -x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)