Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.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_Uuid_Uniqueidentifier - Fatal编程技术网

如何唯一标识git存储库

如何唯一标识git存储库,git,uuid,uniqueidentifier,Git,Uuid,Uniqueidentifier,我想创建一个工具,在克隆远程存储库之前检查我是否已经有了远程存储库的本地克隆。要做到这一点,我需要一种测试B是否与存储库a相同的方法——我想这意味着它们有可合并的历史记录。B的命名可能与A不同,并且可能有额外的分支——通常的用例 有办法做到这一点吗?我有一个初步的想法如何做,但我想也许有人在这里有一个明确的答案 设想 获取分支列表并搜索公共分支(通过哈希)。然后,对于公共分支,检查初始提交是否相同(通过哈希)。在这一点上,我会说“足够好了”。我想我没事,除非有人一直在搅乱历史,我愿意忽略这个用例

我想创建一个工具,在克隆远程存储库之前检查我是否已经有了远程存储库的本地克隆。要做到这一点,我需要一种测试B是否与存储库a相同的方法——我想这意味着它们有可合并的历史记录。B的命名可能与A不同,并且可能有额外的分支——通常的用例

有办法做到这一点吗?我有一个初步的想法如何做,但我想也许有人在这里有一个明确的答案

设想 获取分支列表并搜索公共分支(通过哈希)。然后,对于公共分支,检查初始提交是否相同(通过哈希)。在这一点上,我会说“足够好了”。我想我没事,除非有人一直在搅乱历史,我愿意忽略这个用例。但要做到这一点,我需要一种从远程存储库获取分支和提交信息的方法,而无需进行克隆。我可以使用ssh和bash解决这个问题,但最好是只使用git的解决方案

对这个半生不熟的想法的反馈也是受欢迎的

为什么这不是一个复制品
引用的问题是寻找唯一的存储库id,或者寻找创建唯一存储库id的方法。没有这样的beast存在,即使它存在,它在这里是否相关也值得怀疑,因为我想确定两个存储库是否有可合并的历史记录(即,我可以在两者之间获取和合并)——这是一个定义稍微好一点的问题。我愿意忽略用户修改历史记录的可能性,但也希望听到如何处理这种情况。

.git/config
文件中,您有克隆存储库的url

您可以比较两个存储库的来源

例如:

[remote "origin"]
    url = git://myohost/myproject.git

正如你在相关问题中所看到的;git存储库没有唯一标识。然而;您可以只比较主分支上第一次提交的SHA-1;这在99.999%的情况下就足够了(假设第一次提交永远不会更改)

如果你想更加确信,你也可以考虑使用第二次提交的SHA-1;再次假设它永远不会改变:)。前两次犯罪中的SHA-1;我猜你大概有1/2^320=4.7*10^-97的机会出错

如果您不确定是否有主分支;您可以假设您只有一个无父根提交,并使用它的SHA-1。您可以使用此命令获取根提交(或多个提交):

(抄自)

或者(更容易理解,谢谢@TomHale):


请发表你的“初步想法”,表明你确实考虑过这个问题;有些人在提问前并不认真思考:)我读了上面的问题和它的答案,可能是重复的——有点重叠,但问题之间的差异很大,所以答案并不适用。不过,我确实得到了一个有用的提示——使用git notes的建议可能是一个有趣的方法。然而,我更喜欢非侵入式方法;我的方法只是使用第一个SHA-1就可以很好地工作(同样,如果你以后再也不改变它,但这是不太可能的)是的,我想到了,但这是一个相当弱的测试。如果我这样做了:git克隆ab;git克隆bc;然后该测试将显示一个!=C、 即使它们有可合并的历史记录。而且,对于同一个存储库(SSH与HTTPS),Git remote的外观可能会有所不同。这基本上是我设想的过于简化的版本。如果没有“主”分支,它将失败。你可以说“默认”分支(分支指向头部),但是如果克隆的回购不知道该分支,那将失败。这可能发生在这个工作流中:考虑A分支B1和B2:<代码> Git克隆B-B2;git clone B C现在
git remote-a
将只显示
remotes/b2
。我的试探性方法至少让这个案例正确。但也许有人看到了可以取得的进步?这听起来像是一个赢家。我来看看。
git rev list——父母的头|尾-1
更容易理解,速度更快,而且确实达到了同样的效果;简单多了:)在我的回答中加上了这一点;我保留了另一个;因为可能有一些情况下,无父提交不是列表中的最后一个?@ChrisMaes您假设一个repo的sha1是某个常量c,而实际上它可能是2^160个常量,所有这些常量都同样有效,并且您必须一次一个地将另一个散列与这些值中的每一个进行比较
1-(对于每个可能的c,缺少该特定c的概率)
而不是
1-(缺少单个常数c的概率)
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
git rev-list --parents HEAD | tail -1