git - 检查两个 git 存储库是否相关
问题描述
给定两个裸露的非浅层 git 存储库,我如何以编程方式(通过 Python 脚本)检查它们是否相关?存储库可能具有完全不同的分支,或者指向不同历史的同名分支。如果我只是简单地进行推送(可能使用--dry-run
),即使两个存储库没有任何共同之处,git 也会创建一个新分支。如果我反向执行“拉动”,git 会打印“拒绝合并不相关的历史”,但--dry-run
, 并不表示任何错误。
我的想法是获取两个存储库中所有提交哈希的列表(包括所有分支和没有分支头的“丢失”提交)并检查它们是否包含公共子集。但是,我找不到真正找到所有哈希的方法。
我需要将此作为脚本的一部分,该脚本自动收集对许多存储库所做的更改并将它们合并到这些存储库的旧版本中,但要确保不会意外推送到错误的、可能同名但不相关的存储库。
解决方案
获取 repo 中所有提交哈希的列表
git rev-list --all --full-history
这将报告可从任何 ref 访问的每个提交的哈希,并禁用历史简化 - 这应该可靠地为您提供每个提交哈希。
(可能会“错过”悬空提交,但这些提交通常不会被推送或获取,并且可能会被任意删除,因此没有真正的理由来计算它们。)
对于您要推送的回购协议,上述内容应该没问题。对于您要从中推送的存储库,上述方法同样有效,但比较所有哈希值可能是浪费时间。如果您现在正在应用什么更改,并且更改有意义地适用,那么您应该能够找到可从更改中访问的提交之一。
因此,例如,如果您保持 refs 告诉您上次同步时分支在哪里,那么您可以从列表中排除从这些 refs 中可访问的所有内容。(或者,如果您只是试图使特定分支保持同步,则可以省略这些分支中的每一个。--all
)rev-list
推荐阅读
- java - 创建一个出现在两个给定数组java中的值数组
- python - 使用生成器按多个属性对对象列表进行排序
- javascript - 为什么 js 关键帧 (cssrules) 脚本不能与 IE edge 一起使用,而它可以在 chrome 和 firefox 中使用?
- java - 如何将 JUnit 类移动到包中?
- swift - xcode 10:如何使用“快速打开(shift+command+O)”打开快速代码?
- swift - 使用 DispatchQueue.main.sync 时应用程序崩溃
- javascript - Update asp.net 中的语法错误需要有人来找出我的句子的问题
- matlab - 在matlab中合并具有不同行的表,但我必须并排放置我的文件
- mysql - 如何优化两个查询相似的联合运算符的使用?
- html - d-flex 删除超链接前的空格