【发布时间】:2020-01-28 09:52:30
【问题描述】:
我有一个旧的 .NET 项目,其中包含大量 DLL(并且没有像 NuGet 这样的包管理器)。
文件的总大小约为 1.5 Go
当我用这个项目初始化一个 git 存储库时,.git 的总大小
更新:挖掘@mvp评论后,我发现这个项目中的一些dll重复了多达20次。
$ find . -name '*.dll' -exec basename {} \; > dlls
$ cat dlls | sort | uniq -c | sort -nr | awk '{ print $2, $1 }'
等待一些关于 git 如何识别“重复”并管理它们的答案。
【问题讨论】:
-
也许您有很多重复文件? git 旨在永远不会在对象存储中保留重复的对象。但是内部的 git 压缩也很不错。
-
我正在执行一些 bash 命令来检查这一点,但您可能已经找到了解释,因为我的“项目”由多个模块组成,并且这些模块具有共同的依赖关系。你能把它作为答案,并添加一个关于 git 如何存储重复的解释的链接吗? (基于名称?哈希?名称+哈希?)
-
Git 对您的所有内容进行哈希处理,并仅比较哈希值(实际上不是文件内容)以检测更改。这就是使 git 快速的原因。作为副作用,您可以获得免费的重复检测(文件哈希匹配)
-
哈希基于文件的内容。它是内部“blob 内容”的校验和,即文件加上 Git 需要知道内部对象类型(“blob”)和压缩前大小的小标题。哈希当前是 SHA-1,但 Git 现在正在转换为使用其他算法。
-
我认为我提出的问题(我的用例)与其他两个应该相同的问题明显不同。将它保存在 SO 中作为此 git 结构知识的入口点应该很有用。