195

我在这里提出了同样的问题: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所有相关的历史记录?

4

3 回答 3

350

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 并删除现在未使用的对象. (警告:完全,完全不可逆转。在你做之前要非常确定。)

于 2011-10-04T22:44:55.057 回答
11

如果您使用的是 Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
于 2017-01-13T19:59:22.063 回答
9

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

rm -Rf .git/refs/original
git gc --aggressive --prune=now
于 2018-09-19T08:38:31.657 回答