Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查两个git存储库是否相关_Git_Revision History - Fatal编程技术网

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

检查两个git存储库是否相关,git,revision-history,Git,Revision History,给定两个裸露的非浅层git存储库,如何通过编程(通过Python脚本)检查它们是否相关?存储库可能具有完全不同的分支,或者具有指向不同历史的同名分支。如果我只做一次推送(可能是使用--dry run),git只会创建一个新分支,即使这两个存储库没有任何共同之处。如果我反向“拉”,git打印“拒绝合并不相关的历史记录”,但使用--dry run,并不表示有任何错误 我的想法是获得两个存储库中所有提交哈希的列表(包括所有分支和没有分支头的“丢失”提交),并检查它们是否包含公共子集。然而,我无法找到一

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

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


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

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

git rev-list --all --full-history
这将报告可从任何引用访问的每个提交的哈希值,并禁用历史简化-这将可靠地为您提供每个提交哈希值

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

对于你将要推进的回购协议,上述内容应该可以。对于您正在推出的回购协议,上述方法同样有效,但比较所有散列可能是浪费时间。如果您现在知道您正在应用什么更改,并且更改是有意义的适用的,那么您应该能够从更改中找到一个可访问的提交


例如,如果您让引用告诉您上次同步时分支的位置,那么您可以从列表中排除这些引用中可以访问的所有内容。(或者,如果您只是试图保持特定分支的同步,您可以省略
--all
,只需
rev list
这些分支中的每个分支。)

您可以通过删除
git log
的输出来获得所有提交哈希吗?不,因为这不包括没有头(分支名称)的历史记录。。。“不,因为这不包括没有头(分支名称)的历史记录”。好吧,至少这个特定方面应该首先单独解决,对吗?在Git中,不可访问的对象作为垃圾收集的一部分被删除。如果那里有有用的东西,应该首先“保存”(例如,使用
git fsck
查找它们,并为它们分配一些分支名称)。我不能在不指定名称的情况下获取不可访问对象的哈希吗?此外,一个存储库可能包含一个实际引用某些丢失的提交的头,因此在推送之前指定一个名称是多余的。当然可以。
git fsck
获取不可访问对象的列表。只是,使用这些对象很难没有分配任何ref,因为几乎每个git命令都希望它们是可访问的。此外,您在repo上运行的任何“瓷器”命令都可以随时调用GC并杀死这些不可访问的对象。太好了,谢谢!这正是我想要的。在这种情况下,效率不是问题,所以没问题。