filter-branch --tree-filter之后从git repo中删除refs/original/heads/master?

goo*_*ude 166 git git-rewrite-history git-plumbing

我遇到了与此处提出的问题相同的问题:根目录中的新git存储库包含子目录中的存在存储库

我在这里听到了这个答案:根目录中的新git存储库包含子目录中的存在存储库

现在,gitk --all显示两个历史:一个在当前达到高潮master,一个命名original/refs/heads/master.

我不知道这第二个历史是什么,或者如何从回购中删除它.我的存储库中不需要两个历史记录.

我怎么摆脱它?

重现自己:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)

现在我们有原始海报的问题.让我们使用上面链接的答案将git repo的根目录移动到project-root:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard
Run Code Online (Sandbox Code Playgroud)

现在,看看我目前的问题:

gitk --all &
git show-ref
Run Code Online (Sandbox Code Playgroud)

我如何摆脱refs/original/heads/master和所有相关的历史?

Cas*_*bel 299

refs/original/*是否有备份,以防你弄乱你的过滤器分支.相信我,这是一个非常好的主意.

一旦你检查了结果,并且你非常有信心拥有你想要的东西,你可以删除备份的ref:

git update-ref -d refs/original/refs/heads/master
Run Code Online (Sandbox Code Playgroud)

或者如果你对许多裁判做了这个,你想要把它全部擦掉:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
Run Code Online (Sandbox Code Playgroud)

(这是直接从过滤器分支联机帮助页.)

这不适用于您,但适用于其他可能发现此情况的人:如果您执行过滤器分支,删除占用大量磁盘空间的内容,您可能还希望运行git reflog expire --expire=now --all并使git gc --prune=now您的reflog过期并删除现在未使用的对象.(警告:完全,完全不可逆转.在你做之前要非常确定.)

  • 这是`git update-ref -d refs/original/refs/heads/master`顺便说一句.你可以使用`git show-ref`看到全名. (4认同)
  • 那个较短的`git show-ref refs/original/*--hash |怎么样?xargs -n 1 git update-ref -d`? (4认同)

Gui*_*rte 10

如果您使用的是Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
Run Code Online (Sandbox Code Playgroud)


Kir*_*ich 5

filter-branch保留备份,因此存储库需要清理reflog和垃圾回收。在删除之前,请确保不需要此备份:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)