Git仓库唯一ID

问题描述 投票:6回答:5

我需要确定提交是否属于特定的git存储库。

想法是为我需要测试的每个存储库生成一些唯一的ID。然后,我可以将此唯一ID与通过测试提交计算得出的ID进行比较。

例如,采用初始变更集的SHA。是否可以唯一地标识存储库?

git uuid uniqueidentifier
5个回答
5
投票

SHA1键是关于标识content(斑点或树),而不是关于存储库。如果每个仓库的内容都不相同,那么它的历史就没有共同的祖先,因此我认为基于变更集的解决方案不可行。

也许(未测试),您可以通过git notes添加一些标记(不必更改所有SHA1)。例如,请参见GitHub deploy-notes,它使用此机制来跟踪部署。


1
投票

(从评论中移出)

如果您的存储库中还没有特定提交的父项,那么这是不可能的(在这种情况下,您可以轻松地回答问题)。虽然提交保留对父级的引用并以这种方式维护整个树的完整性,但是如果您没有该提交,则不能仅从哈希中重构提交,因此您无法找到该父级的父级,依此类推,直到您找到实际上位于您的存储库中的父项。


0
投票

您可以使用git filter-branch搜索您要查找的提交。

初始提交的哈希值不会为您提供有关存储库本身的更多信息。无法唯一标识存储库。


0
投票

在Rietveld中,当人们想查找针对其存储库的评论时,我们不能强迫所有人使用'git notes',因此我们将使用git rev-list --parents HEAD输出中的最后一个哈希。


0
投票

与Mercurial比较,支票mercurial/treediscovery.pyMercurial repository identification)在哪里:

base = list(base)
if base == [nullid]:
    if force:
        repo.ui.warn(_("warning: repository is unrelated\n"))
    else:
        raise util.Abort(_("repository is unrelated"))

[base变量存储两个存储库的最后公共部分。

在获取/推送时发出warning: no common commits时,Git具有相同的假设。我只是没有grep Git资源,这需要时间。

通过给出Mercurial推/拉检查的概念,我们可以假设存储库具有相同的根,则它们是相关的。对于水银,这意味着从命令中散列:

$ hg log -r "roots(all())"

对于两个存储库都必须具有非空插入。

您可能不会通过精心制作存储库来欺骗根检查,因为构建两个存储库看起来像这样(具有相同的部分,但是根不同):

0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ

不可能,因为这意味着您反转SHA-256,因为每个后续哈希都取决于先前的值。对于Mercurial和Git都是如此。

查看Git根目录的相应命令是:

$ git log --format=oneline --all --max-parents=0

您可以用:

bash# md git
/home/user/tmp/git

bash# md one
/home/user/tmp/git/one

bash# git init
Initialized empty Git repository in /home/user/tmp/git/one/.git/

bash# echo x1 > x1
bash# git add x1
bash# git ci -m x1
[master (root-commit) 1208fb0] x1

bash# echo x2 > x2
bash# git add x2
bash# git ci -m x2
[master 1c3fe86] x2

bash# cd ..

bash# md two
/home/user/tmp/git/two

bash# git init
Initialized empty Git repository in /home/user/tmp/git/two/.git/

bash# echo y1 > y1
bash# git add y1
bash# git ci -m y1
[master (root-commit) ff56a8e] y1

bash# echo y2 > y2
bash# git add y2
bash# git ci -m y2
[master 18adff5] y2

bash# git fetch ../one/
warning: no common commits
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From ../one
 * branch            HEAD       -> FETCH_HEAD

bash# git co --orphan one
Switched to a new branch 'one'

bash# git merge FETCH_HEAD

bash# git log --format=oneline --all
18adff541c7ce9f1a1f2be2804d6d0e5792ff086 y2
ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c y1
1c3fe8665851e89d37f49633cd2478900217b91c x2
1208fb0f721005207c6afe6a549a9ed0dcc5b0a8 x1

bash# git log --format=oneline --all --max-parents=0
ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c y1
1208fb0f721005207c6afe6a549a9ed0dcc5b0a8 x1

bash# git log --all --graph

* commit 18adff541c7ce9f1a1f2be2804d6d0e5792ff086
|     y2
|  
* commit ff56a8e7e9145d2b1b5a760bbc9b12451927ab0c
      y1

* commit 1c3fe8665851e89d37f49633cd2478900217b91c
|     x2
|  
* commit 1208fb0f721005207c6afe6a549a9ed0dcc5b0a8
      x1

NOTE

Git允许部分签出。我没有为--max-parents=0检查这种情况。
© www.soinside.com 2019 - 2024. All rights reserved.