我的存储库有大量的大文件。它们大多是数据(文本)。有时,由于重构或打包,我需要将这些文件移动到另一个位置。
我使用git mv
命令来"重命名"文件的路径,但它似乎效率低下,因为提交的大小(实际diff大小)非常大,与rm
, git add
相同
是否有其他方法可以减少提交大小?或者我应该把它们添加到.gitignore
并作为zip文件上传到上游?
谢谢你的回答。
通知你,以下一系列命令将生成文件bar
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar
,我认为git做了rm
和add
。请问这个信息和实际尺寸有没有关系?
根据设计,如果您在Git存储库中移动文件而不更改内容,则创建提交将只存储新的元数据(也称为树对象)来表示新的文件位置。由于内容没有改变,Git不需要创建新的blob对象来存储文件内容。所以"commit size"应该很小。
既然你说diff大小是巨大的,我想一些文件内容随着重定位被修改。这可能是"提交大小"非常大的原因。
在这两种情况下,您都可以尝试使用命令git gc --prune --aggressive
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar
这些命令创建了一个新的提交,但是由于foo/bar文件的内容没有改变,Git不会存储任何新的东西,除了新的文件名。事实上,在您的示例中,rename之前的git cat-file -s HEAD:foo
和之后的git cat-file -s HEAD:bar
将给您相同的结果,因为它们的内容相同(.git/objects中的相同blob)。我认为你误解了git内部所做的事情。请查看Git对象以获得进一步的解释。
在git中移动内容不会改变存储库的大小。每个文件在存储库中只存储一次。如果开始更改这些大文件,只会增加存储库的大小。—每个新版本单独存储。
看一下git-annex,也许它适合你。