git 附件 - 如何验证 2 个存储库完全相同

git 附件 - 如何验证 2 个存储库完全相同

如何确保当我从另一个 git 附件存储库克隆、同步和获取内容时,我已经设置了相同的镜像?

我过去使用过像 unison 这样的工具来进行文件与文件的比较,但这是时间和内存密集型的。

还有其他选择可以让我执行健全性检查吗?这样做的主要动机是我刚刚克隆了一个现有的存储库,它更小。我希望它更小,因为旧存储库有未使用或未引用的对象,但它的大小有很大不同。

所以,我想检查一下我是否可以运行。

答案1

Git 有一个内置的健全性检查 ( git fsck),可以指出 git 元数据结构的一般问题。还有一个垃圾收集器 ( git gc) 可以删除悬空和其他多余的东西。

至于数据完整性……基本上这是git提供的保证,你放进去的数据就是你取出来的数据。如果git log(甚至只是最后一次提交的哈希值)相同,那么数据也相同。 git 中的每个步骤都会根据数据、元数据和之前的数据进行校验和;它有点像区块链,如果数据在任何地方发生变化,那么校验和也会发生变化。如果校验和不匹配,git 会在结帐时抱怨很多。

Linus Torvalds 有一篇关于 git 的老演讲(2007-2008 年?),你可以在 Youtube 上观看,IIRC 他还谈到了事物的数据完整性方面。这里还有一些文档:https://git-scm.com/book/en/Git-Internals-Git-Objects

实际上,人们并不担心这个问题,因为 git 神奇地解决了这个问题。您只需执行“git status”即可查看是否需要拉取/推送/提交更改以跟上源。

额外的空间使用也可能有其他原因......git stash如果您曾经使用过它,可能会占用空间。

这也是克隆存储库中存在差异的地方:git 不关心从未提交的本地内容。如果它没有被提交,那么对于克隆来说它就不存在。

答案2

我通过执行以下操作验证了 gitannex 是否按预期工作:

  1. 获取一个排序的、唯一的文件列表,包括 .git 内容(这确保我们拥有所有 git 附件内容)
  2. 获取一个排序的、唯一的链接列表,包括 .git 内容(这确保我们拥有相同的存储库结构)
  3. 比较文件列表,忽略附件/传输目录,git对象可能不同,git附件内容应该相同
  4. 比较链接列表,应该是相同的
  5. 运行 gitannex fsck 或比较所有文件的校验和(这是文件系统问题)

这可行,但可能有点费力/时间密集。此外,由于镜像只是部分副本,该过程可能会进一步复杂化。对于这些镜子,您只需比较您期望拥有的内容。

相关内容