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

Nik*_*lle 33 git version-control git-filter-branch

我正试图从我的git存储库中拆分一个子项目.然而,与Detach(move)子目录不同的是,在 单独的Git存储库中, 我没有它在它自己的子目录中(并且将其移入并执行上述操作仅在移动后生成历史记录).

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

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

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

提前谢谢了

Nei*_*ter 6

这里有一些指示可以做你想要的.

这将删除file_to_remove:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all
Run Code Online (Sandbox Code Playgroud)

  • 问题是我想保留工作目录中的文件及其历史记录,让git忘记所有其他文件.首先找到所有已删除的文件并使用上面的命令删除它们会非常麻烦,这就是为什么即使我发现它并没有太多使用 (28认同)

Nik*_*lle 5

好的,现在我正在尝试使用以下技术,如果它有效,将报告回来,因为它似乎运行时间很长:在 zsh 或 bash 上克隆存储库

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt
Run Code Online (Sandbox Code Playgroud)

获取所有已删除的文件

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 它对您来说运行如此缓慢的原因是因为您正在为每个文件运行 `git filter-branch` 命令***一次***,以及一堆其他命令(`git gc` 不是一个运行命令既便宜又快速),而不是对所有文件运行一次 *** 一次***,因此它可能效率极低。请参阅 [新仓库,仅复制当前跟踪文件的历史记录](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) 中的评论。 (2认同)