删除refs / original / heads / master从git回购后过滤分支 – 树 – filter?

我有同样的问题在这里问: 在根目录中的新git存储库包含子目录中存在的存储库

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

现在, gitk --all显示了两个历史logging:一个在当前的master ,一个名为original/refs/heads/master

我不知道这第二个历史是什么,或者如何从回购中删除它。 我的资料库中不需要两个历史logging。

我如何摆脱它?

重现自我:

 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' 

现在我们有原始的海报的问题。 让我们使用上面链接的答案将git仓库的根移到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 

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

 gitk --all & git show-ref 

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

refs/original/*是作为一个备份,万一你搞砸你的过滤分支。 相信我,这真是一个好主意。

一旦你检查了结果,并且你非常有把握,你有你想要的,你可以删除备份的ref:

 git update-ref -d refs/original/refs/heads/master 

或者如果你这样做了很多的裁判,而且你想把它全部抹掉:

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

(这是直接从filter分支手册页。)

这不适用于你,但对其他人可能会发现这一点:如果你做一个过滤分支, 删除占用大量磁盘空间的内容,你可能还想运行git reflog expire --expire=now --allgit gc --prune=now让你的reflogs过期并删除现在不用的对象。 (警告:完全不可逆转,在做之前要非常确定。)

如果您在Windows PowerShell中:

 git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ } 
Interesting Posts