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