如何唯一标识 git 存储库

How can I uniquely identify a git repository

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

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

设想

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

也欢迎对半生不熟的想法提出反馈。

为什么这不是 Git repository unique id

的副本

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

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

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

示例:

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

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

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

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

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

(复制自this answer

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

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