代码之家  ›  专栏  ›  技术社区  ›  user3142695

如果没有现有标记,如何返回第一次提交?

git
  •  0
  • user3142695  · 技术社区  · 4 年前

    tag=$(git describe --tags --abbrev=0)
    base=$(git rev-parse $tag)
    

    first=$(git log --reverse --oneline)
    

    如何仅获取第一次提交,而不是像上面的命令那样获取列表? 我该如何做一个 or 为了基地?如果标记存在,则返回其提交,如果不存在,则返回第一次提交。

    1 回复  |  直到 4 年前
        1
  •  1
  •   torek    4 年前

    你需要一个测试。

    git tag 命令不起作用 文件 退出状态。手工测试表明 一个,但您可能不希望依赖此未记录的功能。为了避免依赖退出状态,我们可以检查输出:

    tag=$(git describe --tags --abbrev=0)
    if [ "x$tag" = x ]; then
        # there is no tag
        # so here we'll do something different
    fi
    

    在现代的贝壳里,你不需要有点傻 "x$tag" 诀窍:

    tag=$(git describe --tags --abbrev=0)
    if [ "$tag" = "" ]; then ...; fi
    

    要获取可从当前提交访问的根提交的哈希ID,请使用 --max-parents=0 . 理想情况下,只有一个这样的根,但根据存储库历史的形状,有可能有多个,在这种情况下,您必须决定对此要做什么。避免这种可能性的一种方法是,通过只遍历第一个父级,预先确定要查找哪个根。

    git log ,这需要添加 --pretty=format --format 只提取散列ID的指令,通常使用 git rev-list 在这里rev list“管道”命令的一个小麻烦是 必须 提供一个起点,而 吉特日志 HEAD 如果你不提供一个起点。这 是 小调,因为写起来很琐碎 头

    first=$(git rev-list --max-parents=0 --first-parent HEAD)
    

    把这些放在一起,我们得到:

    tag=$(git describe --tags --abbrev=0)
    if [ "$tag" = "" ]; then
        tag=$(git rev-list --max-parents=0 --first-parent HEAD)
    fi
    

    或者更紧凑的形式:

    tag=$(git describe --tags --abbrev=0)
    [ "$tag" != "" ] || tag=$(git rev-list --max-parents=0 --first-parent HEAD)
    

    事实上 尝试 git describe 在存储库中 git描述 步骤失败并输出空字符串执行以下操作:

    $ git describe --tags --abbrev=0
    fatal: No tags can describe '2808ac68000c62c3db379d73e3b7df292e333a57'.
    Try --always, or create some tags.
    $ echo $?
    128
    

    因此,“测试”可以是: git描述 在这种情况下,我们得到:

    tag=$(git describe --tags --abbrev=0 ||
        git rev-list --max-parents=0 --first-parent HEAD)
    

    $ tag=$(git describe --tags --abbrev=0 ||
    >         git rev-list --max-parents=0 --first-parent HEAD)
    fatal: No tags can describe '2808ac68000c62c3db379d73e3b7df292e333a57'.
    Try --always, or create some tags.
    $ echo $tag
    460cce09ff42c43a6826af9deaab0f7a8d1f6f44
    

    要使错误消息消失,我们可以将其重定向到 /dev/null :

    tag=$(git describe --tags --abbrev=0 2> /dev/null ||
        git rev-list --max-parents=0 --first-parent HEAD)
    

    请注意,如果要隐藏错误消息,则无论选择哪种测试方法,都必须执行此重定向。