git clone - detached HEAD - Получить имя тега, который был клонирован из - PullRequest
3 голосов
/ 25 февраля 2020

Этот вопрос о том, как получить имя тега, который был клонирован, для перехода в состояние отключенного HEAD, а не о том, как восстановить его из состояния отключенного HEAD.

У нас есть система сборки, которая клонирует различные git репо по тегам, которые используются в качестве версий. Каждый репозиторий создает выходной файл с версией по имени тега. Это работает достаточно хорошо, но проблема возникает, когда есть два тега на одном коммите. Используемые команды git не справляются с этой ситуацией.

Например, у меня есть репозиторий с двумя тегами версий на одном коммите.

git init
touch .gitignore
git add .
git commit -am "Initial commit"
git tag release-v1
git tag release-v2

Если я хотел построить это репозиторий с версией "release-v2", наша система сборки проверила бы этот репозиторий следующим образом:

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

Из Makefile внутри репозитория мы используем эту команду чтобы получить версию из имени тега:

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

Эта команда, кажется, всегда указывает на первый тег "release-v1", но не обязательно на клонированный тег.

Я нашел эту команду, которая возвращает оба тега, но она все еще не сообщает мне, какой тег был клонирован.

$ git tag --contains $(git rev-parse HEAD)
release-v1
release-v2

Есть ли альтернативная команда, которая всегда возвращает тег, который репозиторий был клонирован или даже git даже не знает, что, поскольку тег просто указывает на идентификатор фиксации?

Эта система сборки очень индивидуальна и определенно имеет некоторые проблемы, поэтому я открыт для альтернативных методов извлечения вообще, если это не требует слишком большого количества больших изменений.

1 Ответ

1 голос
/ 26 февраля 2020

Да, это возможно.

Просто измените команду, которую запускает ваша система сборки:

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

на

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

Параметр --no-tags был выбран доступно начиная с git версии 2.14.0:

--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.

Также проверено на git 2.14.0, и работает так, как вы ожидаете:

?π shang@raspberrypi:/tmp/git $ git version
git version 2.14.0
?π shang@raspberrypi:/tmp/git $ 
?π shang@raspberrypi:/tmp/git $ git clone --single-branch --depth 1 -b release-v2 --no-tags https://github.com/sding3/stackoverflow60400330.git             
Cloning into 'stackoverflow60400330'...
<...snipped...>

?π shang@raspberrypi:/tmp/git/stackoverflow60400330 $  git describe --abbrev=0 --tags
release-v2
?π shang@raspberrypi:/tmp/git/stackoverflow60400330 $ git tag --contains $(git rev-parse HEAD)
release-v2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...