如何唯一标识git存储库

Spa*_*ose 10 git uuid uniqueidentifier

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

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

设想

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

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

为什么这不是Git存储库唯一ID的重复

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

Chr*_*aes 10

正如你在相关问题中看到的那样; 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}$"
Run Code Online (Sandbox Code Playgroud)

(从这个答案复制)

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

git rev-list --parents HEAD | tail -1
Run Code Online (Sandbox Code Playgroud)

  • `git rev-list --parents HEAD | tail -1`更容易理解,更快并且达到相同的效果 (2认同)