我正在将SVN回购迁移到Git,我有7000多个二进制文件我想从导入中排除并从一开始就成为Git历史的一部分,而不是在之后清理它们(参考此{{ 3}})。文件的位置不遵循非常规则的模式,所以我必须提供一个相当长的位置列表给git,我有~8000个提交要考虑。
如果我的目标是避免使用不必要的文件膨胀回购,那么最好的做法是什么?
有没有办法可以从一开始就排除这些,也许作为git svn clone的标志?在克隆之前将它们添加到.gitignore
会阻止它们被添加吗?
另一个选项是导入all,然后用git filter-branch
重写整个历史记录,以便在与其他人共享repo之前删除所有这些文件。
答案 0 :(得分:1)
根据您的问题和评论,我不认为有一种方法可以在没有您不想要的特定文件的情况下简单克隆。
我相信只是将文件放入gitingore文件不会对你对repo做的git克隆产生任何影响。
但是,在服务器上,您可以创建一个过滤的分支,但不能提供这些文件,因为this问题建议的答案之一就其类似问题提出了建议:
在服务器上:
git checkout master^0 # the ^0 checks out the commit itself, not the branch git filter-branch --tree-filter 'git rm -r wp-content/uploads' HEAD git checkout -b filtered
(这里的大型项目的filter-branch在每秒约2-3次提交时生成新的历史记录)
然后,在任何你喜欢的地方, git init git remote add gimme your:// repo / path git fetch gimme filtered
正如documentation所说,filter-branch命令对以下内容非常有用,这似乎很好地包括了你所处的情况:
这些过滤器可以修改每个树(例如,删除文件或对所有文件运行perl重写)或有关每个提交的信息。否则,将保留所有信息(包括原始提交时间或合并信息)。
修改:如果您希望将来从此回购广告提取到其他地方,这还有额外的好处,因此它更简单,因为它是一次修复您应用于原始仓库,而不是为每个单独的克隆执行某些操作。