我正试图从我的git存储库中拆分一个子项目。然而,与Detach (move) subdirectory into separate Git repository不同,我没有它在它自己的子目录中(并且移动它并且执行上述操作仅在移动后产生历史)。
我克隆了我想要将子项目拆分到它自己的存储库中的分支,并删除了子项目未使用的所有内容,所以基本上我可以使用它作为我子项目的存储库。
现在我想要删除不再存在于此存储库中的所有文件的历史记录,以便仅保留使其成为后代的文件的文件历史记录。
我认为必须使用git-filter-branch,但我无法弄清楚如何
提前谢谢了
Here are some instructions to do what you want.
这将删除file_to_remove
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all
好了,现在我正在尝试使用以下技术,将报告它是否有效,因为它似乎运行得很长:在zsh或bash上一个CLONED存储库
git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt
获取所有已删除的文件
for del in `cat deleted.txt`
do
git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all
# The following seems to be necessary every time
# because otherwise git won't overwrite refs/original
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
done;
这可能对您的数据非常危险,因此只能尝试克隆。