Могу ли я сделать так, чтобы Git получал список тегов репозитория без фактического извлечения данных фиксации? - PullRequest
1 голос
/ 06 июня 2019

У меня есть небольшой репозиторий Git, который был создан следующим образом:

mkdir repo
cd repo
git init
git remote add origin $URL
git fetch --depth 1 origin $SHA

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

Итак, у меня была мысль написать простой bash скрипт для углубления истории по мере необходимости:

GIT_HEAD=$(git rev-parse HEAD)
until git describe --tags
do
    git fetch --deepen 100 origin $GIT_HEAD
done

Это не работает, потому что, как сказано в документации для git-fetch:

- глубина = Ограничить выборку указанным числом коммитов из кончика истории каждой удаленной ветви. Если выборка в неглубокое хранилище, созданное git clone с параметром --depth = (см. git- clone (1)), углубить или сократить историю до указанного количества коммитов. Теги для углубленные коммиты не извлекаются.

Затем я попытался использовать git fetch --tags для получения списка тегов, и это работает, но он также выбирает данные фиксации для каждого тега. Репозиторий, с которым я работаю, имеет большую историю и множество тегов, и это приводит к значительному использованию диска / сети / времени (поэтому для начала я использую мелкий клон!).

Есть ли способ заставить Git получать только SHA для тегов, чтобы я мог сопоставить их со списком ревизий моего репозитория при попытке углубить историю? В качестве альтернативы, есть ли способ, которым я могу сделать небольшую выборку из истории репозитория, также получая теги, связанные с этой глубиной?

1 Ответ

1 голос
/ 06 июня 2019

Мне удалось выполнить эту работу с помощью более сложного сценария bash. Идея состоит в том, что, начиная с мелкого репозитория, я итеративно углубляю историю порции коммитов за раз, просматривая в каждом порции теги, которые я могу извлечь с удаленного компьютера (используя git ls-remote --tags, чтобы получить список ссылок на теги, спасибо @ElpieKay за предложение). Я повторяю этот процесс, пока не найду некоторые теги предков, а затем извлекаю их.

# Save the SHA that we're looking backward from.
GIT_HEAD=$(git rev-parse HEAD)
# Number of commits to grab at a time when deepening our commit history.
GIT_FETCH_CHUNK=250
# Loop until we have found some ancestor tags.
ANCESTOR_TAGS=""
while [ -z "$ANCESTOR_TAGS" ]; do
    # Deepen the Git history by a chunk of commits to see if we can find a tag ancestor.
    git fetch --deepen $GIT_FETCH_CHUNK origin $GIT_HEAD
    # Get a list of remote tags and iterate over them.
    while read line; do
        # Tokenize the output, with the SHA in the first column and the tag name in the second.
        TOKENS=($line)
        # Check to see if our repository contains the specified SHA.
        if git branch --contains ${TOKENS[0]} >/dev/null 2>&1; then
            ANCESTOR_TAGS="$ANCESTOR_TAGS ${TOKENS[1]}:${TOKENS[1]}"
        fi
    done <<< "$(git ls-remote --tags)"
done

# Fetch the ancestor tags that we found.
git fetch origin --no-tags $ANCESTOR_TAGS

# Now, we can describe the current revision.
git describe --tags
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...