我在这里提出了同样的问题: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.
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所有相关的历史记录?
refs/original/heads/master
refs/original/*有没有作为备份,以防你弄乱你的过滤器分支。相信我,这真是一个 好 主意。
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 --all并git gc --prune=now过期您的 reflogs 并删除现在未使用的对象. (警告:完全,完全不可逆转。在你做之前要非常确定。)
git reflog expire --expire=now --all
git gc --prune=now