【发布时间】:2020-02-05 18:05:51
【问题描述】:
给定两个裸露的非浅层 git 存储库,我如何以编程方式(通过 Python 脚本)检查它们是否相关?存储库可能具有完全不同的分支,或者指向不同历史的同名分支。如果我只是简单地进行推送(可能使用--dry-run),即使两个存储库没有共同点,git 也会创建一个新分支。如果我反向“拉”,git会打印“拒绝合并不相关的历史”,但--dry-run,并不表示任何错误。
我的想法是获取两个存储库中的 all 提交哈希列表(包括所有分支和没有分支头的“丢失”提交)并检查它们是否包含公共子集。但是,我找不到真正找到所有哈希的方法。
我需要将此作为脚本的一部分,该脚本自动收集对许多存储库所做的更改并将它们合并到这些存储库的旧版本中,但要确保不会意外推送到错误的、可能同名但不相关的存储库.
【问题讨论】:
-
你能通过抓取
git log的输出得到所有的提交哈希吗? -
不,因为这不包括没有头的历史(分支名称)......
-
“不,因为这不包括没有头的历史(分支名称)”。好吧,至少这个特定方面可能应该首先单独解决,对吧?在 Git 中,无法访问的对象作为垃圾收集的一部分被删除。如果那里有什么有用的东西,应该首先“保存”(例如,使用
git fsck找到它们并为它们分配一些分支名称)。 -
我不能在不分配名称的情况下获取无法访问的对象的哈希吗?此外,一个存储库可能包含一个实际引用某些丢失提交的头部,因此在推送之前分配一个名称将是多余的。
-
当然可以。
git fsck获取无法访问的对象列表。只是在没有分配任何 ref 的情况下很难使用它们,因为几乎每个 git 命令都希望它们是可访问的。此外,您在 repo 上运行的任何“瓷器”命令都可以随时调用 GC 并杀死这些无法访问的对象。
标签: git revision-history