我遇到的问题与此处提出的问题相同: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
及所有相关历史记录?
答案 0 :(得分:273)
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
(这是直接从过滤器分支联机帮助页。)
这不适用于您,但适用于可能会发现此问题的其他人:如果您执行的过滤器分支删除占用大量磁盘空间的内容,您可能还需要运行{{ 1}}和git reflog expire --expire=now --all
使您的reflog过期并删除现在未使用的对象。 (警告:完全,完全不可逆转。在你做之前要非常确定。)
答案 1 :(得分:9)
如果您使用的是Windows PowerShell:
git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
答案 2 :(得分:2)
filter-branch
保留备份,因此存储库需要清理reflog和垃圾回收。删除之前,请确保不需要此备份:
rm -Rf .git/refs/original
git gc --aggressive --prune=now