检查两个 git 存储库是否相关

Check if two git repositories are related

给定两个裸露的非浅层 git 存储库,我如何以编程方式(通过 Python 脚本)检查它们是否相关?存储库可能有完全不同的分支,或者指向不同历史的同名分支。如果我只是简单地进行一次推送(可能使用 --dry-run),即使这两个存储库没有任何共同点,git 也会创建一个新分支。如果我反向执行 "pull",git 会打印 "refusing to merge unrelated histories",但 --dry-run 不会指示任何错误。

我想在两个存储库中获取 all 提交哈希列表(包括所有分支和没有分支头的 "lost" 提交)并检查它们是否包含一个公共子集。但是,我找不到真正找到 all 哈希值的方法。

我需要它作为脚本的一部分,该脚本会自动收集对许多存储库所做的更改并将它们合并到这些存储库的旧版本中,但要确保不会意外地推送到错误的地方,可能同名但不相关, 资料库。

获取存储库中所有提交哈希的列表

git rev-list --all --full-history

这将报告可从任何 ref 访问的每个提交的哈希值,并禁用历史简化 - 这应该可靠地为您提供每个提交哈希值。

(有可能 "miss" 悬空提交,但这些通常不会被推送或获取,并且可能会被任意删除,因此没有真正的理由计算它们。)

对于您要推送到的存储库,以上内容应该没问题。对于您从中推送的回购协议,上述方法同样有效,但比较 all 的哈希值可能会浪费时间。如果您现在正在应用哪些更改,并且更改有意义地适用,那么您应该能够找到可以从更改中访问的提交之一。

因此,例如,如果您让 refs 告诉您上次同步时分支在哪里,那么您可以从列表中排除这些 refs 可访问的所有内容。 (或者,如果您只是想保持特定分支的同步,您可以省略 --all 并且只 rev-list 每个分支。)