从git历史中删除已删除的文件

时间:2012-05-20 18:42:49

标签: git version-control git-filter-branch

我正在尝试从我的git存储库中拆分子项目。 然而不像在 Detach (move) subdirectory into separate Git repository 我没有在它自己的子目录中(并将其移入并执行上述操作仅在移动后生成历史记录)。

我克隆了我想要将子项目拆分到自己的存储库中的分支,并删除了子项目未使用的所有内容,所以基本上我可以将其用作子项目的存储库。

现在我想要删除不再存在于此存储库中的所有文件的历史记录,以便仅保留使其成为后代的文件的文件历史记录。

我认为必须使用git-filter-branch才能实现,但我无法弄清楚如何

非常感谢提前

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

好了,现在我正在尝试使用以下技术,如果有效则会报告,因为它似乎运行时间很长: 在zsh或bash ON A CLONED Repository

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;

对于您的数据,这可能是非常危险的,所以只能尝试克隆。