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

39

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

Примечание: с Git 2.17 (Q2 2018), простойgit config fetch.pruneTags true сделает вашgit fetch делай что хочешь! Увидетьmy answer below. VonC
Выглядит немного какstackoverflow.com/questions/1841341/… VonC

Ваш Ответ

7   ответов
6

git tag -l | xargs git tag -d && git fetch -t
Это работает, но может занять много времени на длинной истории тегов
17

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

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

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

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

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

0

Вот альтернативное решение:

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

Отмерзкий выбор документ:

-p --prune

Before fetching, remove any remote-tracking references that no longer exist on the remote. Tags are not subject to pruning if they are fetched only because of the default tag auto-following or due to a --tags option. However, if tags are fetched due to an explicit refspec (either on the command line or in the remote configuration, for example if the remote was cloned with the --mirror option), then they are also subject to pruning.

4

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

# Blow away all local tags, this will remove any that are tagged locally
# but are not on the remote
rm .
# Download all the tags from the remote
git fetch --tags
5

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

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

40

У меня сработало следующее:

git fetch --prune --tags
Я не понимаю, почему это принятый ответ: в документации git (для V1.9.4) прямо сказано, что это НЕ будет работать.
Этот метод не работает
Это именно то, что мне было нужно. На мой взгляд, немного более простой, чем принятый ответ.
Не работает в git 2.1.0
Нет, вы не можете удалить любые локальные теги, просто выполнив & # xB4; git fetch -p -t & # xB4;
12

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 г.)& # xC6; var Arnfj & # xF6; r & # xF0; Бьярмасон (avar).
(Merged by Junio C Hamano -gitster -- всовершить c1a790206 марта 2018 г.)

fetch: add a --prune-tags option and fetch.pruneTags config

Add a --prune-tags option to git-fetch, along with fetch.pruneTags config option and a -P shorthand (-p is --prune).
This allows for doing any of:

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

Or simply:

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

Instead of the much more verbose:

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

Before this feature it was painful to support the use-case of pulling from a repo which is having both its branches and tags deleted regularly, and have our local references to reflect upstream.

At work we create deployment tags in the repo for each rollout, and there's lots of those, so they're archived within weeks for performance reasons.

Without this change it's hard to centrally configure such repos in /etc/gitconfig (on servers that are only used for working with them). You need to set fetch.prune=true globally, and then for each repo:

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

Now I can simply set fetch.pruneTags=true in /etc/gitconfig as well, and users running "git pull" will automatically get the pruning semantics I want.

@realtebo Ну ... неточная форма была реализована только в 2.17, выпущенной на прошлой неделе;)github.com/git-for-windows/git/releases/tag/v2.17.0.windows.1
@mlb Спасибо. Эта функция еще не выпущена, но должна быть частью Git 2.17, выпуск которой запланирован на самое начало апреля 2018 года.
Цвет меня впечатлил! Это адское продолжение на протяжении многих лет, с тех пор как я первоначально спросил. mlb
В моем случае работала только подробная версия.
@realtebo Какую версию Git вы используете?

Похожие вопросы