2010-04-01 74 views
1

我正在将SVN存储库转移到Git中,并且需要从所有分支和标记中删除特定目录(sites/default/files/*)内的所有文件。原因是这个目录中的所有文件都在过去被意外提交了很长时间,现在正在制作Git仓库900+ MB。此存储库尚未共享,因此不用担心更改SHA等。Git:删除跨多个分支的文件夹的内容

任何帮助?我试过按照http://github.com/guides/completely-remove-a-file-from-all-revisions的说明操作,但它们似乎不适合我。

+0

我找到了要运行的命令。它如下:

 git filter-branch -f --index-filter 'git ls-files sites/default/files | xargs git update-index --remove' --tag-name-filter cat -- --all 
之后,克隆到新的本地回购是从数据库中清除所有不需要的文件的最简单的方法。这样做可以将存储库的大小减少700MB! 最后,问题在于文件被其他分支和标签引用。 “--tag-name-filter cat - --all”确保filter-branch命令在所有内容上运行。 – rickvug 2010-04-01 17:13:07

+2

你应该写出这个答案,最好清楚地解释所有的选项为你做了什么。通常情况下,您最好还是点赞其他答案,这些答案对您非常有帮助(由您决定“显着”意味着什么)。 – Cascabel 2010-04-01 17:35:35

回答

0

如果您的回购中有标签,则必须将--tag-name-filter cat添加到git filter-branch命令中。

当然,要查看过滤的任何影响,您必须修剪提交 - 或者更好:将该回购克隆到其他位置,然后查看它是否现在变小。

1

你是什么意思的“似乎没有工作”?没有任何细节很难提供帮助。

对我来说最有可能的是这些指令使用HEAD作为ref的过滤器,所以它只会过滤可以从任何你已经签出的任务到达的提交。你可能想要对所有分支做这件事;而不是git filter-branch ... HEAD你可以使用git filter-branch ... -- --all--表示过滤分支选项结束,而--all表示过滤所有参考。

我可以给的最好的一般建议是阅读filter-branch man page。它也包含一些例子。

最后,请记住旧对象留在回购中。 Debilski谈到了这一点,提到你必须修剪旧物品(git gc --prune=now)或重新制作回购以查看尺寸差异。这对你在当地会很好。

为了让它在远程清理......我相信github最终会运行git gc,但它会使用默认的修剪设置,所以它们在几个星期内不会被修剪。否则,您可以删除并重新创建您的项目。我不知道有什么办法可以在github上强制执行gc。

+0

感谢您的帮助。我收到了类似的有关IRC的指导。希望其他有这个问题的人可以在Stack Overflow上找到这个答案。 – rickvug 2010-04-01 17:14:46