如何唯一标识git存储库

时间:2016-01-19 10:27:54

标签: git

我想创建一个工具,在克隆所述存储库之前检查我是否已经拥有远程存储库的本地克隆。要做到这一点,我需要一种方法来测试B是否与存储库A相同 - 我猜我的意思是他们有可合并的历史记录。 B的名称可能与A不同,可能还有其他分支 - 通常的用例。

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

暂定的想法

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

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

为什么这不是Git repository unique id

的副本

引用的问题是寻找唯一的存储库ID,或者创建一个存储库ID。没有这样的野兽存在,即使它确实存在,它是否与此相关仍然值得怀疑,因为我想确定两个存储库是否具有可合并的历史(即我可以在两者之间获取和合并) - 一个稍微好一点定义的问题。我愿意忽略用户修改历史记录的可能性,但也很想听听如何处理这种情况。

2 个答案:

答案 0 :(得分:9)

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

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

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

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

(从this answer复制)

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

git rev-list --parents HEAD | tail -1

答案 1 :(得分:0)

.git/config文件内,您可以获得克隆存储库的网址。

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

示例:

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