代码之家  ›  专栏  ›  技术社区  ›  Chris Nelson

我可以向Git提交添加元数据吗?或者我可以在Gitk中隐藏一些标签吗?

  •  36
  • Chris Nelson  · 技术社区  · 15 年前

    我想将自定义元数据与 git commit . 专门记录代码评审的评审ID,但它可以是任何东西。标签似乎是一种自然的方法,但我希望每次提交都有一个审查,我不想混乱。 gitk 带着成吨的标签。是否有其他机制来添加自定义元数据?我可以使某些标签不可见吗?如果我能告诉 吉特克 不显示与某个模式或re匹配的标签,这可能有效,但我看不到这样做的方法。

    2 回复  |  直到 8 年前
        1
  •  34
  •   Jörg W Mittag    15 年前

    那正是什么 git notes 是为了。

        2
  •  23
  •   Guildenstern    8 年前

    吉特笔记

    git notes 您可以向提交添加_注释__。您也可以添加它们 对于其他Git对象,但是让_s只关注提交,因为这就是 问题是关于。

    音符是Git对象,原则上可以是任何(任意 数据)。但为了我们的目的,我们会关注一些简单和文本的东西。

    示例:审查ID

    这个问题涉及审查ID,所以让我们用某种方式来表示 这样的事情。我不知道review id到底是什么样子,但是 希望以下内容是合理的:

    Review-id: 42
    

    所以这实际上是一个键值对。让_s将上述字符串添加到 当前提交:

    git notes add -m "Review-id: 42"
    

    如果你跑 git log 注释将显示在内联__中:

    Author: Victor Version Control <vvc@vcs.org>
    Date:   Tue Nov 8 21:10:25 2016 +0100
    
        Implement feature x
    
    Notes:
        Review-id: 42
    

    另一个例子

    当然,你可以在这张纸条上加上更多的子纸条(我们将继续 简单的 key: value 语法,每行一个值)。例如,如果您 三个月后发现commit消息有问题 错误,只需在注释后附加更正:

    git notes append -m "Errata: It was actually feature y."
    

    GIT日志 :

    Author: Victor Version Control <vvc@vcs.org>
    Date:   Tue Nov 8 21:10:25 2016 +0100
    
        Implement feature x
    
    Notes:
        Review-id: 42
    
        Errata: It was actually feature y.
    

    我们使用 git notes append 为了轻松地将这些额外数据添加到 注意事项。你也可以用 git notes edit 为了编辑文件 直接。

    当然,因为git注释只是一个可变文件,所以可以运行 合并冲突。为了降低这种可能性,您可以:

    1. 坚持上述简单数据(每行一个键值)。
    2. 使用特殊的合并策略;请参见 man git-notes ,第节注释 合并策略。

    能见度

    OP问:

    >我可以使某些标签不可见吗?

    默认情况下, GIT日志 只显示一个音符,即 .git/refs/notes/commits . commits 只是名称空间中的一个注释。 也许你想要 问题 要在自己的命名空间中:

    git notes --ref=issues add -m "Fixes: #32"
    

    因为它存储在 .git/refs/notes/issues 而不在 .git/refs/notes/提交 ,_156;fixes:32_运行时不会显示 GIT日志 . 因此,默认情况下,您有效地使这些注释不可见。

    如果你想让它出现,通过 --notes=issues GIT日志 :

    $ git log --notes=issues
    Author: Victor Version Control <vvc@vcs.org>
    Date:   Tue Nov 8 21:10:25 2016 +0100
    
        Implement feature x
    
    Notes (issues):
        Fixes: #32
    

    但是现在 .git/refs/notes/提交 是隐藏的。那个很容易 也包括:

    $ git log --notes=issues --notes=commits
    Author: Victor Version Control <vvc@vcs.org>
    Date:   Tue Nov 8 21:10:25 2016 +0100
    
        Implement feature x
    
    Notes (issues):
        Fixes: #32
    
    Notes:
        Review-id: 42
    
        Errata: It was actually feature y.
    

    有一些变量可以配置默认情况下显示哪些注释;请参见 man git-config .

    与提交消息相比的好处

    当然,元数据可以直接记录在提交消息中。但是 提交消息是不可变的,因此更改它们实际上意味着 全新的承诺,以及由此产生的连锁反应。 另一方面,git注释是可变的,所以您总是能够 修改它们。当然,每一个注释的修改都是版本 受约束的。在我们的案例中, .git/refs/notes/提交 :

    $ git log refs/notes/commits
    Author: Victor Version Control <vvc@vcs.org>
    commit 9f0697c6bbbc6a97ecce9834d4c9afa0d668bcad
    Date:   Tue Nov 8 21:13:52 2016 +0100
    
        Notes added by 'git notes append'
    
    commit b60997e49444732ed2defc8a6ca88e9e21001a1d
    Author: Victor Version Control <vvc@vcs.org>
    Date:   Tue Nov 8 21:10:38 2016 +0100
    
        Notes added by 'git notes add'
    

    分享笔记

    默认情况下,您的笔记不会共享;您必须明确这样做。和 与其他参考资料相比,分享笔记不太友好。我们有 使用 ReFSPEC 语法:

    git push refs/notes/*
    

    上面的内容会把你所有的笔记推到你的遥控器上。

    看来取笔记更复杂,如果 指定参考规范的两侧:

    git fetch origin refs/notes/*:refs/notes/*
    

    所以这绝对不方便。如果你打算使用Git Notes 通常,您可能会希望设置gitconfig以始终获取 笔记:

    [remote "origin"]
        …
        fetch = +refs/notes/*:refs/notes/*
    

    (来源: https://git-scm.com/blog/2010/08/25/notes.html )

    重写时结转笔记

    Git有一个不方便的默认设置,即在提交时不结转Notes 被重写。因此,例如,如果您重新设置一系列提交的基础,那么注释将 不要继续新的承诺。

    变量 notes.rewrite.<command> 默认设置为 true 所以一个人可以 假设注释 接替。但问题是变量 notes.rewriteRef ,这决定了 哪一个 票据将结转,没有 死掉的瓦勒。要设置此值以匹配所有注释,请执行以下操作:

    git config --global notes.rewriteRef "refs/notes/*"
    

    现在,在执行重写操作时,所有的注释都将被执行,例如 git rebase .

    通过电子邮件补丁携带笔记

    如果您正在使用 git format-patch 要将更改格式化为电子邮件发送, 还有一些元数据存储为git-notes,您可以通过 --notes 选择权 Git格式修补程序 以便将注释附加到电子邮件草稿中。


    ___这是默认的 GIT日志 [_] --pretty , --format --oneline 命令行上给出的选项。 man git-log ,Git版本2.10.2