sto*_*tic 7 git git-filter-branch
我开始乱搞git filter-branch.--all选项重写所有分支和标记.凉. git filter-branch创建它覆盖refs/original的所有引用的备份.很酷.现在我想把我所有的实验都filter-branch吹走.
有没有一种简单的方法来完全撤消效果git filter-branch <whatever filter> -- --all?即将所有重写的分支一次性恢复到原始状态?
如果没有预先存在的方式,应该有.如果没有预先存在的方式,是否有人会有一个简短的脚本来执行此操作?
显然有一些解决方法.我可以手动恢复它,一次一个分支,就像在这个问题中一样.或者我可以直接核对并重新克隆.要么在一个包含许多分支/标签的回购中快速繁琐,要么(比如说)被分成更小的回购.
这是一个简单而安全的撤消过滤器分支的方法:
git fetch . +refs/original/*:*
Run Code Online (Sandbox Code Playgroud)
如果当前签出的branch(HEAD)是要还原的分支之一,则此命令将失败.您可以git checkout --detach预先运行以git fetch更新所有分支.记得跑完后结帐一个分店git fetch!
成功恢复引用后,可以refs/original使用以下命令安全地删除引用:
git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin
Run Code Online (Sandbox Code Playgroud)
老答案:
git for-each-ref refs/heads refs/tags \
--format='git update-ref "%(refname)" "%(refname)@{1 hour ago}"'
Run Code Online (Sandbox Code Playgroud)
为了增加安全性,您可以测试filter-branch是否确实更新了ref:
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
Run Code Online (Sandbox Code Playgroud)