当使用depth=1克隆仓库时,获取最新的标签(`git describe --tags')是什么?

6

我在CI自动化工作流程中遇到了读取git仓库标签的问题。我不想创建完整克隆,因为这会产生大量开销,所以我更喜欢保持“浅克隆”,但是要找到应用程序版本的标签。

使用案例

  1. Github Actions CI构建通过设置 git clone ... --depth=1 作为'浅'克隆来检查Git-Repository。
  2. 预构建阶段执行 git describe --tags 将版本信息嵌入编译后的应用程序中。

期望结果

使用完全克隆会报告标签如下:

> git describe --tags
v0.5.0-95-g7bbc323

实际结果

CI下的浅克隆不起作用:

> git describe --tags
fatal: No names found, cannot describe anything.

解决方案想法

  • 修改CI下的“克隆”操作,以某种方式包含标签?
  • 如果可能的话,修改预构建的“描述”步骤,从远程读取标签?
5个回答

2

结合此主题上的答案,以下是对我起作用的内容:
(我有$BRANCH_NAME环境变量中的分支名称)

TAG=$(git ls-remote remote "refs/tags/v*[0-9]" | cut -f 2- | sort -V | tail -1)
# fetch all commits up to but excluding the TAG
git fetch --filter=tree:0 --shallow-exclude $TAG origin $BRANCH_NAME
# extend by one
git fetch --filter=tree:0 --deepen=1 origin $BRANCH_NAME
# get the tag itself
git fetch --filter=tree:0 --depth=1 origin $TAG:$TAG

1

你可以很容易地做到这一点,获取像这样的切片历史记录只需要知道在哪里迈出步伐,就像说话一样:

对于支持过滤的托管服务器(所有大型服务器都支持):

git fetch --filter=tree:0 origin +refs/tags/*:refs/tags/* +refs/heads/*:refs/remotes/origin/*

否则,您可以自己进入上游存储库并进行操作。
git bundle create just-the-structure.bundle --filter=tree:0 --tags --branches

然后将该文件复制到您的目标系统中,并在目标仓库中使用。

git bundle unbundle just-the-structure.bundle

1
你不能这样做。为了让git describe工作,你必须拥有标签和它们指向的提交,并且能够向后遍历历史记录,找到最近的标签。当你使用--depth=1克隆时,你只克隆了一个提交,因此无法遍历。
但是,你可以使用--filter=tree:0进行部分克隆,然后你只有标签和提交,直到你执行检出操作,此时只会从服务器中填充该提交的blob和tree。然而,我不确定GitHub Actions是否原生支持此功能,所以你可能需要自己处理。

我真的认为你的答案可能是正确的方向,可以帮助找到一个好的解决方案!git clone --filter=tree:0 <url>可以在我的预构建脚本中运行,我还没有使用过这个命令,将会研究如何使用它进行脚本编写。你可以更新答案,以便在脚本中运行并加以详细说明,我可能会接受这个答案 :) 如果它有效,我认为可以保留修改Actions checkout模块的计划到另一天! - Crog

0

对我来说,我只是做了以下操作:

      - name: Get latest tag
    run: |
      git fetch -a
      latest_tag=$(git describe --tags `git rev-list --tags --max-count=1`)

希望这可以帮到你!:)

0

你也可以在远程上查找并获取最新的标签。然后当你拥有它时,你只需要获取那一个。

tag=$(git ls-remote origin "refs/tags/v*[0-9]" | cut -f 2- | sort -V | tail -1)
git fetch --depth 1 origin "$tag":"$tag"

以上的脚本应该只获取最新的标签(假设您以v开头并以数字结尾)。

但是,遗憾的是,它无法解决git describe的问题,因为您缺少此标记与您的main之间的提交。

所以我现在用git clone --depth 1024随便试试,肯定比这更频繁地打标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接