代码之家  ›  专栏  ›  技术社区  ›  Armen Michaeli

从“git descripe”派生应用程序构建版本-如何获得相对简单的字符串?

  •  14
  • Armen Michaeli  · 技术社区  · 14 年前

    git describe 做我想要的,但它不包括我所在的分支名称,它包括缩写的commit SHA-1 hash,我认为我不需要它,因为它不会给字符串的熵添加任何内容,并且可能是多余的(这里我可能错了,所以请更正我)。

    我有什么选择?我的想法是正确的吗?当我有更重要的软件开发方面的事情要处理时,我只是有点厌倦了在版本上附加数字。

    4 回复  |  直到 5 年前
        1
  •  12
  •   Aristotle Pagaltzis    14 年前

    关于git,您需要了解的是,分支本质上只是提交书签。事实上你在 foo 当你做出决定的时候 0deadbeef 承诺对承诺本身并不重要;分支不是其标识的一部分。

    (Mercurial将分支名称烘焙到commit中。 In a variety of ways, this is inferior, as Dustin Sallings explains .)

    git describe 如果您有一个小的历史记录,那么只使用当前签出的分支,可能有多个路径指向同一个最近的标记提交 git描述 会用的。所以不一定有

    另一个注意:你可能会反对,即使第三次提交从标记X是含糊不清的,在一般情况下, 你可以看看这个图表 describe 字符串将变得不明确 回顾性地

    底线是 只有 git描述 是不是加了一些 冗余

        2
  •  12
  •   Jeet    14 年前

    我用的是:

    echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
    

    它会产生如下结果:

    master-6de772e
    

    正如亚里士多德所指出的,事实上,SHA-1本身就是提供一个明确的构建标签以及关于发展历史背景的完整信息所必需和足够的。其他一切都是多余的,因为它们提供的任何信息都可以从SHA-1中找到或得到。然而,人们可能也希望实际分支的补充上下文信息立即变得明显(或者,至少,这个人确实如此),因此将分支名称嵌入到标签中。出于这个原因(即对信息的即时人工解析),除了上面给出的构建标识“标签”外,我的大多数项目还使用更长的构建标识“描述”,其中包括构建所基于的提交的日期和时间。

        3
  •  6
  •   Jakub Narębski adamtaub    14 年前

    git describe --long 总是输出如下版本号: v1.2-10-gdeadbee版本 注释 标签“v1.2”指向commit,缩写为SHA-1“deadbee”。所以你所要做的就是标记分支开始(分支的分支点)。 < branch >-start .

    缩写的commit SHA-1散列需要用来区分不明确的情况,因为“第三次commit,因为标记'x'”(例如)不能唯一地区分提交;在存在非线性分支开发的情况下,可以有多个符合上述描述的提交。例如,在下面的ASCII艺术图表所示的情况下,标记为*的两个提交都符合“第三次提交,因为标记为'x'”的描述。

              /-.---*---.-\                   
             /             \                  
    .---x---.---.---*---.---M---.    <--- branch
    

    请注意,在如上所示的“merged in”情况下,不能使用分支名称来区分具有相同描述的两个提交。

    所以你要做的就是 git描述--长 输出 --long 选项用于避免解析时出现歧义,请参见 git describe manpage ),解析它,并添加当前分支信息(例如。 git symbolic-ref HEAD 从帕辛 git branch (输出)你自己。

        4
  •  6
  •   Olaf Mertens    13 年前

    官方版本应该有一个带有版本号的标签。 在这种情况下,我建议采用以下方法:

    1. 如果当前提交有标记,请使用该标记
    2. 如果没有可用的标记,请使用分支名称和SHA1键

    git describe --exact-match 2> /dev/null || echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"