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

Posted

技术标签:

【中文标题】在 filter-branch --tree-filter 之后从 git repo 中删除 refs/original/heads/master?【英文标题】:Remove refs/original/heads/master from git repo after filter-branch --tree-filter? 【发布时间】:2011-12-01 01:46:40 【问题描述】:

我也有同样的问题: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 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

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

gitk --all &
git show-ref

如何删除 refs/original/heads/master 和所有相关历史记录?

【问题讨论】:

How to delete the old history after running git filter-branch?的可能重复 【参考方案1】:

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-branch 手册页。)

这不适用于您,但适用于可能会发现此问题的其他人:如果您执行过滤器分支 删除 占用大量磁盘空间的内容,您可能还想运行 @987654324 @ 和 git 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 我猜你不小心混淆了:如果我是对的,应该是git update-ref -d original/refs/heads/master?但是,只有您的第二个命令对我有用。 这是git update-ref -d refs/original/refs/heads/master btw。您可以使用git show-ref查看全名。 较短的git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d怎么样? 使用 gitextensions 有 View > Show reflog commits,这完全避免了这个备份;无论你用这种方式在 git 中做什么,你总是有一个清晰可见的备份。【参考方案2】:

如果您使用的是 Windows PowerShell:

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

【讨论】:

【参考方案3】:

filter-branch 保留备份,因此存储库需要清理引用日志和垃圾收集。确保删除前不需要此备份:

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

【讨论】:

以上是关于在 filter-branch --tree-filter 之后从 git repo 中删除 refs/original/heads/master?的主要内容,如果未能解决你的问题,请参考以下文章

git filter-branch应用

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

核弹级的git指令 git filter-branch

尝试使用 git filter-branch 修复行尾,但没有运气

在 git 中提交消息前缀

Git tree-filter 在提交时运行 python 脚本