【问题标题】:Git repository unique idGit 存储库唯一 ID
【发布时间】:2011-06-26 23:45:46
【问题描述】:

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

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

例如,采用初始变更集的 SHA。能否唯一识别存储库?

【问题讨论】:

  • 当你说“属于”是指“起源于”还是“被发现于”?
  • 嗯...我无法检查提交是否真的可以在 repo 中找到(需要太多时间)。但我想知道存储库中是否存在测试提交的某些祖先。我认为这意味着“起源”:)
  • 你是对的......但是让我们从另一个角度看一下:我的存储库和您的存储库是从同一来源克隆的。我们能否找出来源相同的事实(无需尝试推送/获取)
  • 在两个具有相同初始提交的存储库中肯定有一些含义。您在这里的真正最终目标是什么?

标签: git uuid uniqueidentifier


【解决方案1】:

SHA1 密钥是关于识别内容(一个 blob 或树的),而不是关于存储库。
如果内容因仓库而异,那么它的历史没有共同的祖先,所以我认为基于变更集的解决方案行不通。

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

【讨论】:

  • 感谢您的回答。我只是假设 SHA 还包含执行“git init”或其他任何时间的一些时间戳......
  • @Ilya:不仅仅是这样:提交的 SHA1 取决于它的所有内容:元数据(日期、作者、消息)、树和 它的父级)。如果提交或其任何祖先有任何差异,则 SHA1 将会改变。
  • 谢谢!这可能节省了几个小时阅读手册:)
【解决方案2】:

(从评论中移出)

如果您的存储库中没有特定提交的父级,这是不可能的(在这种情况下,您可以简单地回答这个问题)。虽然提交包含对父级的引用并以这种方式维护整个树的完整性,但如果您没有该提交,则无法仅从哈希重建提交,因此您无法找到该父级的父级,依此类推,直到你会找到一个实际上在你的存储库中的父级。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        与 Mercurial 比较,检查 mercurial/treediscovery.py (Mercurial 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 变量存储两个存储库的最后一个公共部分。

        Git 在 fetch/push 上发出 warning: no common commits 时具有相同的假设。我只是没有 grep Git 源代码,这需要时间。

        通过给出 Mercurial 推/拉检查的这个想法,我们可以假设如果存储库有共同的根,它们是相关的。对于 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
        

        注意 Git 允许部分结帐。我没有为--max-parents=0检查这个案例。

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 1970-01-01
          • 2013-10-07
          • 2016-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          • 2020-10-25
          相关资源
          最近更新 更多