在git存储库中移动大量的大文件

时间:2013-05-30 21:17:34

标签: git rename mv large-data

我的存储库包含大量大文件。 它们主要是数据(文本)。 有时,由于重构或打包,我需要将这些文件移动到其他位置。

我使用git mv命令来“重命名”文件的路径,但是提交的大小(实际差异大小)非常大,与rm相同,效率似乎低效, git add

还有其他方法可以减少提交大小吗? 或者我应该将它们添加到.gitignore并作为zip文件上传到上游?


感谢您的回答。

FYI, 以下一系列命令将产生文件bar

的大小
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

我认为git做了rmadd。 你能告诉我这个信息是否与实际尺寸无关吗?

2 个答案:

答案 0 :(得分:5)

按照设计,如果您在Git存储库中移动文件而不更改内容,则创建提交将仅存储新元数据(a.k.a。树对象)以表示新文件位置。 由于内容不变,Git不需要创建新的blob对象来存储文件内容。 因此“提交大小”应该相当小。

既然你说diff大小很大,我想一些文件内容会随着重定位一起被修改。这将是“提交规模”巨大的原因。

在这两种情况下,您都可以尝试使用命令git gc --prune --aggressive

缩小.git目录大小

编辑:

git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

这些命令创建了一个新的提交,但是由于foo / bar文件内容没有改变,Git不会存储任何新的提交,而是新的文件名。实际上,在您的示例中,git cat-file -s HEAD:foo在重命名之前和git cat-file -s HEAD:bar之后将给出相同的结果,因为它具有相同的内容(.git / objects中的相同blob)。 我认为你错误地解释了git在内部做的事情。请查看Git objets以获得进一步的解释。

请记住,git会跟踪内容,而不是文件。

答案 1 :(得分:1)

在git中移动东西不会改变存储库的大小。每个文件只存储在存储库中一次。如果您开始更改这些大文件,则只会增加存储库的大小。 - 然后每个新版本都单独存储。

看看git-annex,也许这对你来说是正确的。