在git仓库中移动大量大文件

6
我的存储库包含大量大文件。 它们大多是数据(文本)。 有时,由于重构或打包,我需要将这些文件移动到另一个位置。
我使用“git mv”命令“重命名”文件的路径,但是似乎效率不高,因为提交的大小(实际差异大小)非常巨大,与“rm”、“git add”相同。
是否有其他方法可以减少提交的大小? 或者我应该将它们添加到“.gitignore”中并作为ZIP文件上载到上游?
谢谢答案。
以下一系列命令将导致文件“bar”的大小 FYI。
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

我曾经认为git命令可以进行rmadd操作。请问这个信息与实际大小是否相关?


“commit size”是什么意思? - michas
2个回答

10

在设计上,如果你在Git仓库中移动一个文件而不改变内容,创建提交(commit)将只存储新元数据(也称为树对象)来表示新文件位置。由于内容没有改变,Git不需要创建新的blob对象来存储文件内容。因此,“提交大小”应该相当小。

既然您说差异(diff)size很大,我认为一些文件内容与重新定位一起被修改了。这是“提交大小”很大的原因。

在两种情况下,您都可以尝试使用命令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对象以获得更进一步的解释。

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


2
在Git中移动文件不会改变存储库的大小。每个文件在存储库中仅被存储一次。只有当您开始更改这些庞大的文件时,才会增加存储库的大小。此时每个新版本都将被单独存储。
建议查看git-annex,也许这是适合您的正确解决方案。

这并没有发生在我身上。我重命名了一些包含图像文件的目录。git将它们标记为重命名,在git push期间,我不得不等待上传完成,而且仓库的大小增加了600 MB(这是图像文件的大小)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接