我该如何唯一地识别一个git仓库

12
我想创建一个工具,在克隆特定仓库之前检查本地是否已经有了该远程仓库的本地副本。为此,我需要一种测试B和仓库A是否相同的方法——我指的是它们具有可合并的历史记录。B可能与A命名不同,并且可能有附加分支——通常的用例。
有没有办法做到这一点?我有一个初步的想法,但我想也许在这里有人有确定的答案。
初步想法:获取分支列表并搜索公共分支(按哈希值)。然后对于共同的分支,检查初始提交是否相同(按哈希值)。那时我会说“够好了”。我认为除非有人搞乱了历史记录,否则我没问题,而这个用例我愿意忽略。要做到这一点,我需要一种从远程仓库获取分支和提交信息而不进行克隆的方法。我可以使用ssh和bash解决这个问题,但仅使用git的解决方案更可取。
对半成品想法的反馈也受欢迎。
这不是Git repository unique id的重复原因:
所引用的问题正在寻找唯一的存储库标识符或创建方式。这种方法不存在,即使存在,它也值得怀疑是否适用于此处我想确定两个存储库是否具有可合并的历史记录(即我可以在两者之间获取和合并)。这是一个略微更好定义的问题。我愿意忽略用户修改历史记录的可能性,但很愿意听到如何处理这种情况。

1
请发表您的“初步想法”,以显示您确实在提问之前进行了思考;有些人在提问之前并没有真正思考 :) - Chris Maes
1
可能是Git仓库唯一ID的重复问题。 - Chris Maes
我阅读了上面的问题及其答案--虽然有一些重叠,但这些问题的不同之处足以使那里的答案并不适用。然而,我确实从中获得了一个有用的提示--使用git notes的建议可能是一个有趣的方法。然而,我更喜欢一种非侵入式的方法。 - Spacemoose
如果您想要一个非侵入式的解决方案,我的方法只使用第一个SHA-1就可以很好地工作(再次强调,如果之后您从未更改它,但这是非常不可能的)。 - Chris Maes
1个回答

14

正如你在相关问题中看到的那样,一个 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}$"

(翻译自这个回答)

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

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

那基本上是我初步想法的过度简化版本。如果没有“主”分支,它将失败。你可以说“默认”分支(由HEAD指向的分支),但如果克隆的repo不知道该分支,这种工作流程就会失败——考虑A有b1和b2两个分支:git clone A B -b2; git clone B C现在git remote -a只会显示remotes/b2。我的初步方法至少能够正确处理这种情况。但也许有人看到了可以改进的地方? - Spacemoose
听起来很不错。我会去看看的。 - Spacemoose
3
git rev-list --parents HEAD | tail -1 更易理解、更快,且能达到相同效果。 - Tom Hale
@FilipHaglund 感谢您的评论;只是为了知道,您能告诉我它更有可能是以什么方式吗? - Chris Maes
1
@ChrisMaes 你假设一个仓库的sha1为某个常数c,但实际上可能有2^160个常数,都是同样有效的,你必须逐个将另一个哈希值与这些值进行比较。应该使用1-(对于每个可能的c错过此特定c的概率)而不是 1-(错过单个常数c的概率)。参考维基百科“生日问题”。 - Filip Haglund
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接