首页 > 解决方案 > 检查两个 git 存储库是否相关

问题描述

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

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

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

标签: gitrevision-history

解决方案


获取 repo 中所有提交哈希的列表

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

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

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

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

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


推荐阅读