【问题标题】:How can I uniquely identify a git repository如何唯一标识一个 git 存储库
【发布时间】:2016-04-24 18:45:57
【问题描述】:

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

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

初步设想

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

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

为什么这不是Git repository unique id 的重复项

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

【问题讨论】:

  • 请张贴您的“初步想法”,以表明您确实考虑过这一点;有些人在提问之前并没有真正思考过:)
  • Git repository unique id的可能重复
  • 我阅读了上述问题及其答案——有一点重叠,但问题差异很大,以至于那里的答案并不真正适用。然而,我确实在那里得到了一个有用的提示——使用 git notes 的建议可能是一种有趣的方法。不过,我更喜欢非侵入式的方法。
  • 如果你想要一个非侵入式的解决方案;我的方法只使用第一个 SHA-1 就可以正常工作(同样;如果你以后再也不改变它,但这不太可能)

标签: git uuid uniqueidentifier


【解决方案1】:

正如您在相关问题中看到的那样; git 存储库没有唯一标识。然而;您可以只比较主分支上第一次提交的 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

【讨论】:

  • 嗯,这基本上是我初步想法的过度简化版本。如果没有“master”分支,它将失败。您可以说“默认”分支(由 HEAD 指向的分支),但如果克隆的 repo 不知道该分支,这将失败——这可能发生在这个工作流中:考虑 A 有分支 b1 和 b2:@ 987654325@ 现在git remote -a 将只显示remotes/b2。我的试探性方法至少使这种情况正确。但也许有人看到了可以改进的地方?
  • 这听起来像是赢家。我去看看。
  • git rev-list --parents HEAD | tail -1更容易理解,速度更快,达到同样的效果
  • 确实;容易得多:) 将其添加到我的答案中;我保留了另一个;因为也许在某些情况下,无父提交不是列表中的最后一个?
  • @ChrisMaes 您假设一个 repo 的 sha1 是某个常量 c,而实际上它可能是 2^160 个常量,都同样有效,并且您必须将另一个哈希与每个这些值一次一个。 1-(probability of missing this particular c, for each possible c) 而不是 1-(probability of missing the single constant c) en.wikipedia.org/wiki/Birthday_problem
【解决方案2】:

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

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

例子:

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

【讨论】:

  • 是的,我想到了,但这是一个相当弱的测试。如果我这样做: git clone A B;混帐克隆 B C;那么该测试将显示 A != C,即使它们具有可合并的历史记录。
  • 此外,Git 远程对于同一个存储库可能看起来不同(SSH 与 HTTPS)
猜你喜欢
  • 2013-10-07
  • 2011-06-26
  • 2015-09-14
  • 2020-10-25
  • 1970-01-01
  • 2023-04-06
  • 2016-07-14
  • 2018-06-27
  • 1970-01-01
相关资源
最近更新 更多