如何在使用 filter-branch --tree-filter 后从 git 仓库中删除 refs/original/heads/master?

203

我有与这里提出的问题相同:New git repository in root directory to subsume an exist repository in a sub-directory

我按照这个答案进行操作: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仓库的根目录移动到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及其相关历史记录?


3个回答

366

refs/original/*是在你错用filter-branch时的备份。相信我,这是个非常好的主意。

当你检查结果并且非常有信心你已经得到了想要的东西后,你可以删除备份的引用:

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-branch手册中摘录的。)

这并不适用于您,但适用于可能会发现这一点的其他人:如果您进行一个filter-branch操作,该操作删除占用大量磁盘空间的内容,则还可以运行git reflog expire --expire = now --allgit gc --prune = now以过期您的reflogs并删除现在未使用的对象。(警告:完全、彻底地不可逆转。执行此操作之前请务必非常确定。)


执行了 update-ref、reflog expire 和 gc 操作之后,这两个文件仍然引用原始的 ref:.git/info/refs 和 .git/packed-refs。看起来可能应该改成这样:git update-ref -d refs/original/refs/heads/master - lhunath
1
我猜你不小心把单词搞混了:如果我没错的话,应该是 git update-ref -d original/refs/heads/master?然而,只有你的第二个命令对我起作用。 - JJD
4
顺便提一下,正确的命令是 git update-ref -d refs/original/refs/heads/master。你可以用 git show-ref 命令查看完整的名称。 - poke
4
这个命令是什么意思:缩短后的 git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d 是什么? - CharlesB
使用GitExtensions,可以通过“查看”>“显示Reflog提交”来完全避免备份;这样,无论您在Git中做什么,您始终都有一个清晰可见的备份。 - TamaMcGlinn

11

如果你在使用Windows PowerShell:

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

10

filter-branch 会保留备份,因此存储库需要清理引用日志和垃圾回收。在删除之前,请确保不再需要这些备份:


rm -Rf .git/refs/original
git gc --aggressive --prune=now

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接