如何在Git仓库中克隆最新标签?

7
git ls-remote --tags git://github.com/git/git.git

列出最新的标签而不进行克隆。我需要一种方法能够直接从最新标签进行克隆。


可能是 https://dev59.com/lnRA5IYBdhLWcg3w4iF_ 的重复问题,该问题涉及使用 Git 下载特定标签。 - Rosa
3个回答

9

请将其命名为~/bin/git-clone-latest-tag

#!/bin/bash

set -euo pipefail
basename=${0##*/}

if [[ $# -lt 1 ]]; then
    printf '%s: Clone the latest tag on remote.\n' "$basename" >&2
    printf 'Usage: %s [other args] <remote>\n' "$basename" >&2
    exit 1
fi

remote=${*: -1} # Get last argument

echo "Getting list of tags from: $remote"

tag=$(git ls-remote --tags --exit-code --refs "$remote" \
  | sed -E 's/^[[:xdigit:]]+[[:space:]]+refs\/tags\/(.+)/\1/g' | tail -n1)

echo "Selected tag: $tag"

# Clone as shallowly as possible. Remote is the last argument.
git clone --branch "$tag" --depth 1 --shallow-submodules --recurse-submodules "$@"

然后你可以执行:

% git clone-latest-tag https://github.com/python/cpython.git
Getting list of tags from: https://github.com/python/cpython.git
Selected tag: v3.8.0b1
Cloning into 'cpython'...
remote: Enumerating objects: 4346, done.
...

1
我想命令应该是“git-clone-latest-tag”而不是“git clone-latest-tag”,对吗? - Cris70
2
@Cris70 不是这样的,git 内部会寻找名为 git-* 的脚本。使用 git clone-latest-tXX 也会给你一个类似的命令: clone-latest-tag。 - Tom Hale
对于Windows用户:打开git-bash。输入cd /bin。然后输入start .以在资源管理器中打开/bin目录(通常为C:\Program Files\Git\usr\bin)。在此处插入脚本。 - Mir-Ismaili
这是错误的。版本排序不是基于“自然排序”,而是基于词典顺序,所以v0.9.1将被视为比v0.10.0等更晚的版本。更新:编辑答案以包括sort -V - undefined

1
这是一个老问题,但没有得到我满意的答案(即可读性强的单行代码 :-))。
这个单行代码将为您获取仅最新标签的存储库克隆。
REPO=https://github.com/namespace/repo.git && \
git clone $REPO --single-branch --branch \
$(git ls-remote --tags --refs $REPO | tail -n1 | cut -d/ -f3)

说明

  1. 首先我们设置了一个REPO变量。我们需要它两次,这样可以减少错误的机会。
  2. 然后我们使用$(git ls-remote --tags --refs $REPO | tail -n1 | cut -d/ -f3)将最新的标签作为变量获取。
  3. 最后我们将其指定为要克隆的“分支”

我已经尝试过几个repo,没有任何问题(当然,没有标签的repo会失败),但如果有改进的地方,请告诉我。

您可以添加任何内容,例如-c advice.detachedHead=false以避免出现关于分离状态的长时间警告。


虽然这可能超出了您的控制范围,但经历版本更改的存储库将会出现问题。一个例子是 helix-editor/helix。最新版本是22.08,它位于列表中间。 - sweenish
我找到的唯一解决方法是先克隆存储库,然后添加 --sort=taggerdate 就可以检出最新的标签。似乎所有按日期排序的键都需要对象数据,这意味着你不能只克隆最新的标签。对于我的目的来说,这仍然足够接近。 - sweenish
这是错误的。版本排序不是基于“自然排序”,而是按字典顺序进行的,所以v0.9.1将被视为比v0.10.0等更晚的版本。 - undefined

0
# Clone repo
$ git clone <url>

# Go into repo folder
$ cd <reponame>

# Get new tags from the remote
$ git fetch --tags

# Get the latest tag name, assign it to a variable
$ latestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

# Checkout the latest tag
$ git checkout $latestTag

发现了这个解决方案在这里

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