小编典典

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

all

我在这里提出了同样的问题:New git repository in root directory to subsume an existing
repository in a sub-
directory

我在这里遵循了这个答案:New git repository in root directory to subsume an existing
repository in a sub-
directory

现在,gitk --all显示了两个历史:一个在
currentmaster中达到高潮,另一个在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所有相关的历史记录?


阅读 90

收藏
2022-07-12

共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 联机帮助页。)

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

2022-07-12