2016-04-29 31 views
-1

以前,我从git仓库中删除了数千个.pdf文件。但问题是,即使我删除了这些文件,它们仍然存在于先前的修订版中,以便我仍然可以通过访问历史记录来恢复它们。现在我得到非常大的包文件,这是非常令人沮丧的。从以前的git修改版中彻底删除数千个.pdf文件?

现在我想要从git的所有修订中彻底删除所有这些.pdf文件,并且我不想让它们回到永远以减少我的回购的大小。我怎样才能做到这一点?所有的.pdf文件都在提交中被删除。

我在谷歌搜索,发现git filter-branch可能解决我的问题。但我发现的所有解决方案都是在git revisons中找到非常大的文件,并将其从回购库中彻底删除。我想要的是完全删除成千上万的占用磁盘空间的.pdf文件。

任何帮助,高度赞赏。谢谢。

+1

无论是移除一个大文件,多个大文件,多个小文件等,原理都是一样的。 filter-branch命令提取现有提交,应用过滤器,并在结果中创建新提交,然后调整分支标签(如果使用标记过滤器,则为标记)以指向新提交而不是旧提交。其中最棘手的部分是编写过滤器:如果文件都在一个已知的地方(如果只有一个大文件,那真的很容易),这会更容易。 – torek

+0

@torek不幸的是,这些文件分布在很多目录中。但我想知道是否可以使用正则表达式在'git filter-branch'命令中编写pdf文件。 –

回答

3

每评论,扩展成一个答案......

有两个简单的(当然,“不太难”)的方法来处理是:

  1. 使用--tree-filter(很慢)此过滤器:

    git filter-branch ... \ 
        --tree-filter "find . -name '*.pdf' -print0 | xargs -0 rm" \ 
        ... 
    
  2. 使用--index-filter(更快):

    git filter-branch ... \ 
        --index-filter "git ls-files -z -- '*.pdf' | xargs -0 git rm --cached" \ 
        ... 
    

在这两种情况下,如果你想标记移动到复制的提交(和阅读文档的其余部分使用filter-branch)一定要包括--tag-name-filter cat

此处假定您想要摆脱全部文件名与*.pdf相匹配的文件。如果您需要更具选择性,请注意filter-branch只是运行eval $filter的筛选器:没有任何说...部分不能包含或不包含shell脚本的路径,您可以在其中编写复杂测试,而无需拟合他们成一个大的eval - 可靠的字符串。

相关问题