Подтвердить что ты не робот

В git, как мне синхронизировать мои теги с удаленным сервером?

Есть ли способ сохранить локальные теги git в блокировке с помощью удаленных тегов? То есть - не только создавать новые теги при создании (как обычно, при fetch -ing/pull -ing), но также обрезать теги больше не на удаленном компьютере, а также удалять существующие теги, когда кто-то еще git push -f a тег. Я знаю, что я могу git fetch remotename, а затем git remote prune remotename для достижения аналогичного поведения для ветвей.

4b9b3361

Ответ 1

... также удаляйте теги больше не на пульте

git fetch получает с Git 2.17 (Q2 2018) удобную короткую руку для избавления от устаревших тегов, которые хранятся локально.

См совершать 6317972, совершать 97716d2, совершает e249ce0, совершает 627a129, совершает d0e0747, совершает 2c72ed7, совершает e1790f9, совершает 59caf52, совершает 82f34e0, совершает 6fb23f5, совершает ca3065e, совершает bf16ab7, совершает eca142d, совершает 750d0da, совершает 0711883, совершает ce3ab21, совершить aa59e0e (09 февраля 2018 г.) автор Арварфьорд Бьярмасон (avar).
(Объединено Junio C Hamano - gitster - в коммите c1a7902, 06 марта 2018 г.)

fetch: добавить параметр --Prune-tags и конфигурацию fetch.pruneTags

Добавить --Prune-tags опцию git-fetch, наряду с fetch.pruneTags конфигурации опции и -P стенографии (-P является --Prune).
Это позволяет выполнять любое из:

git fetch -p -P
git fetch --prune --prune-tags
git fetch -p -P origin
git fetch --prune --prune-tags origin

Или просто:

git config fetch.prune true &&
git config fetch.pruneTags true &&
git fetch

Вместо гораздо более многословного:

git fetch --prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'

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

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

Без этого изменения сложно централизованно настроить такие репозитории в /etc/gitconfig (на серверах, которые используются только для работы с ними). Вам нужно установить fetch.prune=true глобально, а затем для каждого репо:

git -C {} config --replace-all remote.origin.fetch "refs/tags/*:refs/tags/*" "^\+*refs/tags/\*:refs/tags/\*$"

Теперь я могу просто установить fetch.pruneTags=true в /etc/gitconfig, и пользователи, использующие " git pull ", автоматически получат семантику /etc/gitconfig, которую я хочу.

Ответ 2

Следующие работали для меня:

git fetch --prune --tags

Ответ 3

Немного исследований показало, что git не имеет возможности сказать разницу между локальными или чужими тегами (все теги идут в .git/refs/tags/). Поэтому невозможно определить разницу между локально созданными тегами и черновиками удаленных тэгов. Параметры затем сводятся к: наличию постоянно растущего набора тегов или только тегам, которые находятся на сервере.

git push --tags origin && \
git tag | xargs -n1 git tag -d && \
git fetch --tags

Отбросьте первую строку для последнего поведения и может быть потенциально git alias'd для частого использования.

Альтернативой может быть создание ветки (поскольку они могут быть идентифицированы как локальные/удаленные) в точке тега и никогда больше не записываться в нее. Затем использование remotename/branchname в качестве тега для проверки будет поддерживать теги в синхронизации (в дополнение к git fetch и git remote prune remotename).

В любом случае это взломать, и "правильный" ответ заключается в том, чтобы перестать изменять теги все время.

Ответ 4

Другое решение, которое действительно работает для меня:

git tag -l | xargs git tag -d && git fetch -t

Ответ 5

git push -tags подталкивает ваши локальные теги к серверу. По умолчанию git fetch (первая половина git pull или git pull --rebase) будет тянуть теги, но вы можете указать -t или --tags, чтобы вытащить все из них.

Я не уверен, как обрезать удаленные теги, но выборка должна вытащить любые обновленные теги.

Ответ 6

отказ от ответственности использует внутренние элементы git (некоторые могут утверждать, что файловая система является интерфейсом git, но для другого дня: D)

# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .git/refs/tags/*

# Download all the tags from the remote
git fetch --tags

Ответ 7

Здесь альтернативное решение:

git fetch -p +refs/tags/*:refs/tags/*

Из git fetch doc:

-п --prune

Перед извлечением удалите все ссылки удаленного отслеживания, которые больше не существуют на пульте дистанционного управления. Теги не подлежат обрезке, если они выбирается только из-за автоматического отслеживания тега по умолчанию или из-за --tags. Однако , если теги извлекаются из-за явного refspec (либо в командной строке, либо в удаленной конфигурации, для например, если пульт был клонирован с опцией --mirror), , то они также подлежат обрезке.

Ответ 8

используйте эти команды для синхронизации тегов (удалите все локальные, затем извлеките все удаленные)

git tag -d $(git tag) # delete all local tags
git fetch --all # fetch all remote to local