我的存储库包含大量大文件。 它们主要是数据(文本)。 有时,由于重构或打包,我需要将这些文件移动到其他位置。
我使用git mv
命令来“重命名”文件的路径,但是提交的大小(实际差异大小)非常大,与rm
相同,效率似乎低效, git add
还有其他方法可以减少提交大小吗?
或者我应该将它们添加到.gitignore
并作为zip文件上传到上游?
感谢您的回答。
FYI,
以下一系列命令将产生文件bar
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar
我认为git做了rm
和add
。
你能告诉我这个信息是否与实际尺寸无关吗?
答案 0 :(得分:5)
按照设计,如果您在Git存储库中移动文件而不更改内容,则创建提交将仅存储新元数据(a.k.a。树对象)以表示新文件位置。 由于内容不变,Git不需要创建新的blob对象来存储文件内容。 因此“提交大小”应该相当小。
既然你说diff大小很大,我想一些文件内容会随着重定位一起被修改。这将是“提交规模”巨大的原因。
在这两种情况下,您都可以尝试使用命令git gc --prune --aggressive
编辑:
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,也许这对你来说是正确的。