git clone-分离头-获取从中克隆的标记名

git clone-分离头-获取从中克隆的标记名,git,Git,这个问题是关于获取从中克隆的标记名以进入分离的头部状态,而不是如何从分离的头部状态恢复 我们有一个构建系统,它通过用作版本的标记来克隆各种git repo。每个repo构建一个输出文件,该文件由标记名进行版本控制。这已经足够好了,但是当同一个提交上有两个标记时就会出现问题。正在使用的git命令不能处理这种情况 例如,我有一个这样的repo,在同一个提交上有两个版本标签 git init touch .gitignore git add . git commit -am "Initial comm

这个问题是关于获取从中克隆的标记名以进入分离的头部状态,而不是如何从分离的头部状态恢复

我们有一个构建系统,它通过用作版本的标记来克隆各种git repo。每个repo构建一个输出文件,该文件由标记名进行版本控制。这已经足够好了,但是当同一个提交上有两个标记时就会出现问题。正在使用的git命令不能处理这种情况

例如,我有一个这样的repo,在同一个提交上有两个版本标签

git init
touch .gitignore
git add .
git commit -am "Initial commit"
git tag release-v1
git tag release-v2
如果我想用版本“release-v2”构建此回购协议,我们的构建系统将检查此回购协议,如下所示:

git克隆--单分支--深度1-b release-v2 repo.git

从repo内部的Makefile中,我们使用以下命令从标记名获取版本:

VERSION:=$(shell git descripe--abbrev=0--tags)

这个命令似乎总是指向第一个“release-v1”标记,但不一定指向从中克隆的标记

我发现这个命令确实返回了两个标记,但它仍然没有告诉我克隆了哪个标记

$ git tag --contains $(git rev-parse HEAD)
release-v1
release-v2
是否有另一个命令总是返回repo从中克隆的标记,或者git甚至不知道,因为标记只指向提交ID

这个构建系统是非常定制的,肯定有一些问题,所以如果不需要太多大的更改,我完全可以选择其他的签出方法。

是的,这是可能的

只需更改生成系统运行的命令:

git clone --single-branch --depth 1 -b release-v2 repo.git

自git 2.14.0版以来,
--no tags
选项一直可用:

--no-tags
    Don’t clone any tags, and set remote.<remote>.tagOpt=--no-tags in the config, ensuring that future git pull and git fetch
    operations won’t follow any tags. Subsequent explicit tag fetches will still work, (see git-fetch(1)).

    Can be used in conjunction with --single-branch to clone and maintain a branch with no references other than a single
    cloned branch. This is useful e.g. to maintain minimal clones of the default branch of some repository for search
    indexing.
--无标记
不要克隆任何标记,并在配置中设置remote..tagOpt=--无标记,确保将来的git pull和git fetch
操作不会跟随任何标记。后续的显式标记获取仍然有效(请参见git获取(1))。
可以与--single branch结合使用,以克隆和维护除单个分支外没有引用的分支
克隆分支。这是非常有用的,例如,维护一些存储库的默认分支的最小克隆以供搜索
索引。

还通过git 2.14.0进行了验证,它的工作原理与您预期的一样:


常规标记是单向映射:给定一个标记,您可以获得提交,但提交不知道哪些标记可能引用它。如果您使用带注释的标记,那么标记本身就是一个特定的提交。但是,如果我从标记签出而不是从标记克隆,git似乎知道它是从哪个标记分离出来的<代码>git签出版本-v2
。然后
git分支
返回
*(从release-v2分离)
。我不明白它是怎么知道的。可能是参考日志?(它会知道以前提到的
HEAD
是什么意思。)你是什么意思?它怎么知道的?您可以将其放入命令行。
git checkout
将信息写入HEAD reflog<代码>git状态将其清除。这不是一个100%可靠的过程。看起来这正是我想要的,并且需要非常小的更改。非常感谢。
--no-tags
    Don’t clone any tags, and set remote.<remote>.tagOpt=--no-tags in the config, ensuring that future git pull and git fetch
    operations won’t follow any tags. Subsequent explicit tag fetches will still work, (see git-fetch(1)).

    Can be used in conjunction with --single-branch to clone and maintain a branch with no references other than a single
    cloned branch. This is useful e.g. to maintain minimal clones of the default branch of some repository for search
    indexing.