Мы используем теги в git как часть нашего процесса развертывания. Время от времени мы хотим очистить эти теги, удалив их из нашего удаленного хранилища.
Это довольно просто. Один пользователь удаляет локальный тег и удаленный тег в одном наборе команд. У нас есть небольшой сценарий оболочки, который объединяет оба этапа.
2-й (3-й, 4-й, ...) пользователь теперь имеет локальные теги, которые больше не отображаются на пульте.
Я ищу команду, подобную git remote prune origin
которой очищает локально отслеживающие ветви, для которых удаленная ветвь была удалена.
В качестве альтернативы можно использовать простую команду для отображения удаленных тегов для сравнения с локальными тегами, возвращаемыми через git tag -l
.
git config fetch.pruneTags true
заставит васgit fetch
делать то, что вы хотите! Смотрите мой ответ на этот другой вопрос .Ответы:
Хороший вопрос. :) У меня нет полного ответа ...
Тем не менее, вы можете получить список удаленных тегов через
git ls-remote
. Чтобы вывести список тегов в репозитории, на который ссылаютсяorigin
, вы должны выполнить:Это возвращает список хэшей и понятных имен тегов, например:
Вы, конечно, могли бы собрать bash-скрипт, чтобы сравнить теги, сгенерированные этим списком, с тегами, которые вы используете локально. Посмотрите на
git show-ref --tags
, который генерирует имена тегов в той же форме, что иgit ls-remote
).Кроме того,
git show-ref
есть вариант, который противоположен тому, что вы хотели бы. Следующая команда выведет список всех тегов в удаленной ветке, которых у вас нет локально:источник
git remote | xargs -L 1 git ls-remote --tags | git show-ref --tags --exclude-existing
Это отличный вопрос, мне было интересно то же самое.
Я не хотел писать сценарий, поэтому искал другое решение. Ключ обнаруживает, что вы можете удалить тег локально, а затем использовать git fetch, чтобы «вернуть его» с удаленного сервера. Если тег не существует на удаленном компьютере, он останется удаленным.
Таким образом, вам нужно набрать две строки по порядку:
Эти:
Удалить все теги из локального репо. FWIW, xargs помещает каждый вывод тега с помощью «tag -l» в командную строку для «tag -d». Без этого git ничего не удалит, потому что не читает stdin (глупый git).
Получить все активные теги из удаленного репо.
Это даже работает на Windows.
источник
git tag prune origin
команда.git tag -l | %{git tag -d $_}
чтобы заставить это работать в PowerShell. Не уверен ни в ком другом.От Git v1.7.8 до v1.8.5.6 вы можете использовать это:
Обновить
Это не работает на более новых версиях git (начиная с v1.9.0) из-за commit e66ef7ae6f31f2 . Я действительно не хочу удалять это, так как это действительно работало для некоторых людей.
Как предлагает "Chad Juliano", со всей версией Git начиная с v1.7.8, вы можете использовать следующую команду:
Вам может потребоваться заключить часть тегов в кавычки (например, в Windows), чтобы избежать расширения по шаблону:
источник
git fetch --prune <remote> +refs/tags/*:refs/tags/*
не работал в ZSH, однако он работает в BASH*
но если вы пишете одинарную кавычку, все будет хорошо.git fetch origin --prune --prune-tags
ИЛИgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ИЛИgit fetch <url of origin> --prune --prune-tags
ИЛИgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
git fetch origin --prune --prune-tags
удалить как удаленные отслеживания ветки и теги. проверил в версии git 2.18.Если вам нужны только те теги, которые существуют на пульте, просто удалите все свои локальные теги:
А затем получить все удаленные теги:
источник
xargs
. Если у вас больше теговARG_MAX
или подобных ограничений, это не сработает. Маловероятно, но возможно, и поэтомуxargs
это здорово.git config --global alias.prune-tags '!git tag -d $(git tag) && git fetch --tags'
Обязательный псевдоним команды. Наслаждаться. :-)Похоже, последние версии Git (я на git v2.20) позволяют просто сказать
Гораздо чище!
https://git-scm.com/docs/git-fetch#_pruning
Вы также можете настроить git так, чтобы он всегда удалял теги при получении:
Если вы хотите удалять теги только при извлечении с определенного пульта, вы можете использовать эту
remote.<remote>.pruneTags
опцию. Например, чтобы всегда удалять теги при извлечении из источника, но не с других пультов,источник
Все версии Git начиная с v1.7.8 понимают
git fetch
с refspec, тогда как начиная с v1.9.0--tags
опция переопределяет эту--prune
опцию. Для решения общего назначения попробуйте это:Подробнее о том, как изменилось поведение «--tags» с «--prune» в Git v1.9.0, смотрите: https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c
источник
origin
наupstream
и git исправил мои локальные теги, основанные на восходящем потоке; Далееgit push origin :<deleted-tag-name>
обновил мой GitHub форк, удалив удаленный тег.git fetch --prune --prune-tags origin
git fetch origin --prune --prune-tags
ИЛИgit fetch origin --prune 'refs/tags/*:refs/tags/*'
ИЛИgit fetch <url of origin> --prune --prune-tags
ИЛИgit fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
Git изначально поддерживает очистку локальных тегов:
Эта команда извлекает последние теги и удаляет все удаленные теги.
источник
это хороший метод:
git tag -l | xargs git tag -d && git fetch -t
Источник: demisx.GitHub.io
источник
Показать разницу между локальными и удаленными тегами:
git tag
дает список локальных теговgit ls-remote --tags
дает список полных путей к удаленным тегамcut -f2 | grep -v '\^' | sed 's#refs/tags/##'
анализирует только имя тега из списка путей удаленных теговСтроки, начинающиеся с «<», - это ваши локальные теги, которых больше нет в удаленном репо. Если их немного, вы можете удалить их вручную один за другим, если их много, вы сделаете больше операций по нарезке и обвязке для их автоматизации.
источник
diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort) | grep ">" | cut -c3- | xargs -I{} git push origin :refs/tags/{}
diff <(git show-ref --tags | grep -v '{}' | awk '{print $1 " " $2}') <(git ls-remote --tags origin | grep -v '{}' | awk '{print $1 " " $2}')
<
, а с числа, за которым следует запятая, а затем то, что выглядит как первые три символа хеша коммита (?), например7,8d4
...Просто добавили команду git sync-local-tags в вилку Gem pivotal_git_scripts на GitHub:
https://github.com/kigster/git_scripts
Установите гем, затем запустите «git sync-local-tags» в своем хранилище, чтобы удалить локальные теги, которые не существуют на удаленном компьютере.
В качестве альтернативы вы можете просто установить этот скрипт ниже и назвать его «git-sync-local-tags»:
источник
Я знаю, что опоздал на вечеринку, но теперь есть быстрый ответ на это:
Да, теперь есть возможность получить.
Если вы не хотите получать и просто обрезать:
источник
Как насчет этого - отбросить все локальные теги, а затем повторно получить? Учитывая, что ваш репо может содержать подмодули:
источник
TortoiseGit теперь может сравнивать теги.
Левый журнал находится на удаленном, правый на локальном.
Использование функции сравнения тегов в диалоге синхронизации:
Также смотрите TortoiseGit выпуск 2973
источник
Ответ тот же, что и у @Richard W, но для Windows (PowerShell)
источник
Я добавляю команду
SourceTree
в качестве пользовательского действия на моем MacOS.Установка с
Custom Actions
помощьюSourcetree
->Preferences...
->Custom Actions
Script to run
должен бытьgit
путь.Я использую
git fetch --prune --prune-tags origin
для синхронизации тегов от удаленного к локальному.источник
В новой версии git (как v2.26.2)
Так что вам нужно будет запустить:
источник