2011-10-04 56 views
126

我有同样的问题,这里问:New git repository in root directory to subsume an exist repository in a sub-directory在filter-branch --tree-filter之后从git repo中删除refs/original/heads/master?

我跟着这个答案在这里:New git repository in root directory to subsume an exist repository in a sub-directory

现在,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' 

现在我们有原来的海报的问题。让我们用上面链接的答案混帐回购协议的根移动到项目根:

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和所有相关的历史?

+1

可能重复[如何删除运行git过滤后的悠久历史-branch?](http://stackoverflow.com/questions/5984428/how-to-delete-the-history-after-running-git-filter-branch) – user

回答

213

refs/original/*是否有作为备份,以防你搞乱你的过滤器分支。相信我,这是一个真的好主意。

一旦你检查的结果,你非常有信心,你有你想要的东西,你可以删除备份裁判:

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

,或者如果你这样做了许多裁判和你想消灭这一切:

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

(这是直接取自过滤器分支手册页。)

这并不适用于你,但其他人谁可能会发现:如果你做过滤麸皮ch其中删除内容占用大量磁盘空间,您可能还想运行git reflog expire --expire=now --allgit gc --prune=now以过期您的reflog并删除现在未使用的对象。 (警告:彻底,完全不可逆转非常肯定你这样做之前。)

+0

做了update-ref之后,reflog expire和gc ,这两个文件仍然参考原始参考:.git/info/refs和.git/packed-refs 看起来也许应该这样说:'git update-ref -d refs/original/refs/heads /主' – lhunath

+1

我猜你不小心混了e字:如果我是对的,它应该是'git update-ref -d original/refs/heads/master'?但是,只有你的第二个命令为我工作。 – JJD

+4

这是'git update-ref -d refs/original/refs/heads/master'顺便说一句。你可以用'git show-ref'来看全名。 – poke

4

如果你在Windows PowerShell中:

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