从远程 git 仓库中查找最新的 git 标签

8

我需要从远程git仓库获取最新的git标签。 以下是我使用的命令以查找最新的标签:

git ls-remote --tags xxxxx@xxxx.xxxx.net:xxxx.git |grep "\."|grep -v -|grep -v {| sort -n -t. -k3 -k4

这会产生以下输出。
c8be4313ae8261214acb6d3d41f9ece8d47a4ad5    refs/tags/v0.2.1
9e776cff51a8bb15f0539b852a819723d1e37c69    refs/tags/v0.2.2
ee1f173f4e7da0996af9f7c91e0952bec8c2358b    refs/tags/v0.1.3
5d6777bf2b2e5bae41ae9ab966320c691c1f2ee2    refs/tags/v0.1.4
6d3040673330ed763bc0c1a6e6cd5dbc82392d4f    refs/tags/v0.1.5
4afd29dc48805053be911a85c6da6b195e96e786    refs/tags/v0.1.6
8d5cc76d50b153f836561bb933b1f5ad488748d1    refs/tags/v0.1.7
1c0cdebaed828aaef2897c9240b4440898f70766    refs/tags/v0.1.8
683de590ba8d633c801d2628f4d9de58f9de371a    refs/tags/v0.1.9
925797f07cfc94a3af1f56cdabd856e11b222b78    refs/tags/v0.1.10

但我需要找到最新创建的v0.2.2版本。如何找到最新创建的标签(具有最新创建日期的标签)?是否有其他方法可以做到这一点?


你为什么认为v0.2.2不是列表中的第一个? - greg0ire
我不知道。 - shrikant1712
1
“最新标签”是什么意思?是指版本号最高的标签吗?还是指创建日期最近的标签? - sleske
我需要带有最新创建日期的标签。 - shrikant1712
你能确认一下v0.2.2和v0.2.1是否实际上在代码中处于同一位置,即使v0.2.2是后创建的?那就可以解释顺序了。 - eis
显示剩余4条评论
2个回答

10

你可能需要获取最新可达标签,而不是最新创建的标签:

git describe --tags --abbrev=0

无论如何,如果你确实需要最后创建的标签:

git有两种类型的标签:轻量级和注释型。如果你的标签是轻量级的,那就很遗憾,你不能做到这一点,因为没有跟踪创建日期的功能。如果你可以访问远程仓库所在的文件系统,那么你可以尝试检查/refs/tags下文件的时间戳,但这些信息不一定准确(只是该特定仓库中标签文件创建的时间戳)。

然而,对于注释性标签,你可以获取创建日期;一旦你得到sha(通过ls-tree或其他方式),运行以下命令:

git cat-file -p <sha>

显示标记器、消息和创建日期或者简单地:

git show <sha>

还可以额外显示引用的提交。

在脚本中使用这些信息是可行的(可能由于日期格式不太容易处理)。

我本来打算把你引荐到关于标签的git内部描述,但结果发现所有这些信息也在ProGit,Git基础-标记上有描述。


你说得对,对于轻量级标签确实有一定的难度。所以我已经使用了注释标签。 - shrikant1712

1

假设可以在本地确定此事是可接受的,您可以通过以下方式确保标签是最新的:

git fetch --tags

然后从命令行运行以下代码:
git rev-list --tags --timestamp --no-walk |
    sort -nr |
    head -n1 |
    cut -f 2 -d ' ' |
    xargs git describe --contains

使用--tags参数的git rev-list命令会列出所有标签相关的提交记录,而--timestamp参数可以确保每行前缀都带有提交的时间戳。选项--no-walk告诉rev-list不要列出任何父提交记录,因此输出中只显示与标签相关的提交记录。sort -nr表示按数字大小和相反顺序排序,以使最新时间戳的提交记录位于顶部。cut命令允许我们剥离标记提交的提交ID。

在我的Python Nose存储库中运行此命令,将得到以下结果:

:: git rev-list --tags --timestamp --no-walk | sort -nr | head -n1 | cut -f 2 -d ' ' | xargs git describe --contains
release_1.3.0

如果你必须完全远程进行,那么你实际上没有选择选择最新创建日期的选项。这些信息根本没有被宣传。由于所有这些元数据都包含在对象中,因此您需要首先将对象下载到本地仓库中。

我尝试了你的解决方案,它在本地运行良好。但是当我尝试远程操作时,它给出了错误提示:“fatal: Not a git repository (or any of the parent directories): .git”。 - shrikant1712
1
@shrikant1712,由于您无法访问任何元数据,因此它无法在远程上工作。抱歉。唯一的真正选择是解析标签的名称以进行远程解决方案。如果您无法从那里获得所需内容,则无法完成。如果您真的很懂技术,可以编写客户端来获取标记对象,然后使用元数据执行所需操作。但这不是一项容易的任务。 - John Szakmeister
有没有办法将我们的两个命令合并在一起?(我的命令和你的命令)? - shrikant1712
1
很抱歉,不行。我上面提到的需要一个本地仓库。 - John Szakmeister

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