Удалите локальные теги git, которые больше не находятся в удаленном репозитории



мы используем теги в Git, как часть нашего процесса развертывания. Время от времени мы хотим очистить эти теги, удалив их из нашего удаленного репозитория.



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



2-й (3-й, 4-й,...) пользователь теперь имеет локальные теги, которые больше не отражаются на пульте дистанционного управления.



Я ищу команду похоже на git remote prune origin который очищает локальные ветви отслеживания, для которых удалена удаленная ветвь.



кроме того, простая команда для перечисления удаленных тегов может использоваться для сравнения с локальными тегами, возвращаемыми через git tag -l.

821   11  

11 ответов:

хороший вопрос. :) У меня нет полного ответа...

тем не менее, вы можете получить список удаленных тегов через git ls-remote. Чтобы перечислить теги в репозитории, на которые ссылается origin, вы бы побежали:

git ls-remote --tags origin

это возвращает список хэшей и дружественных имен тегов, таких как:

94bf6de8315d9a7b22385e86e1f5add9183bcb3c        refs/tags/v0.1.3
cc047da6604bdd9a0e5ecbba3375ba6f09eed09d        refs/tags/v0.1.4
...
2f2e45bedf67dedb8d1dc0d02612345ee5c893f2        refs/tags/v0.5.4

вы, конечно, могли бы собрать сценарий bash для сравнения тегов, созданных этим списком, с тегами, которые у вас есть локально. Взгляните на git show-ref --tags, который генерирует тег имена в том же виде, что и git ls-remote).


кроме того, git show-ref есть вариант, который делает противоположное тому, что вы хотели бы. Следующая команда перечислит все теги на удаленной ветке, которые вы не локально:

git ls-remote --tags origin | git show-ref --tags --exclude-existing

это отличный вопрос, мне было интересно то же самое.

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

таким образом, вам нужно ввести две строки по порядку:

git tag -l | xargs git tag -d
git fetch --tags

Это:

  1. удалить все теги из местных РЕПО. Чистки рядов, размер места каждый выходной тег "тег -Д" на командной строке для "тег -д". Без этого git ничего не удалит, потому что он не читает stdin (глупый git).

  2. извлеките все активные теги из удаленного РЕПО.

Это даже работает удовольствие на Windows.

от Git v1.7.8 до v1.8.5. 6, Вы можете использовать это:

git fetch <remote> --prune --tags

обновление

Это не работает на более новых версиях git (начиная с v1.9. 0) из-за commit e66ef7ae6f31f2. Я действительно не хочу, чтобы удалить его, так как он работал для некоторых людей.

как предложил "Чад Джулиано", со всей версией Git начиная с v1.7. 8, вы можете использовать следующую команду:

git fetch --prune <remote> +refs/tags/*:refs/tags/*

возможно, вам придется заключить часть тегов в кавычки (on Например, Windows), чтобы избежать расширения подстановочных знаков:

git fetch --prune <remote> "+refs/tags/*:refs/tags/*"

Если вы хотите только те теги, которые существуют на удаленном устройстве, удалите все ваши локальные теги:

$ git tag -d $(git tag)

и затем получить все удаленные теги:

$ git fetch --tags

все версии Git начиная с v1.7.8 понимают git fetch С refspec, тогда как с v1.9. 0 переопределяет . Для решения общего назначения, попробуйте это:

$ git --version
git version 2.1.3

$ git fetch --prune origin "+refs/tags/*:refs/tags/*"
From ssh://xxx
 x [deleted]         (none)     -> rel_test

для дальнейшего чтения о том, как изменилось поведение "--tags" с "--prune" в Git v1. 9. 0, см.:https://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c

это хороший способ:

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

Источник:demisx.GitHub.io

показать разницу между локальными и удаленными тегами:

diff <(git tag | sort) <( git ls-remote --tags origin | cut -f2 | grep -v '\^' | sed 's#refs/tags/##' | sort)
  • git tag дает список локальных тегов
  • git ls-remote --tags дает список полных путей к удаленным теги
  • cut -f2 | grep -v '\^' | sed 's#refs/tags/##' анализирует только имя тега из списка удаленных путей тегов
  • наконец, мы сортируем каждый из двух списков и различаем их

строки, начинающиеся с"

добавить синхронизация-местные-теги в Git команду, чтобы pivotal_git_scripts камень форк на GitHub:

https://github.com/kigster/git_scripts

установите gem, затем запустите "git sync-local-tags" в своем репозитории, чтобы удалить локальные теги, которые не существуют на удаленном устройстве.

в качестве альтернативы вы можете просто установить этот скрипт ниже и назвать его "git-sync-local-tags":


#!/usr/bin/env ruby

# Delete tags from the local Git repository, which are not found on 
# a remote origin
#
# Usage: git sync-local-tags [-n]
#        if -n is passed, just print the tag to be deleted, but do not 
#        actually delete it.
#
# Author: Konstantin Gredeskoul (http://tektastic.com)
#
#######################################################################

class TagSynchronizer
  def self.local_tags
    `git show-ref --tags | awk '{print }'`.split(/\n/)
  end

  def self.remote_tags
    `git ls-remote --tags origin | awk '{print }'`.split(/\n/)
  end

  def self.orphaned_tags
    self.local_tags - self.remote_tags
  end

  def self.remove_unused_tags(print_only = false)
    self.orphaned_tags.each do |ref|
      tag = ref.gsub /refs\/tags\//, ''
      puts "deleting local tag #{tag}"
      `git tag -d #{tag}` unless print_only
    end
  end
end

unless File.exists?(".git")
  puts "This doesn't look like a git repository."
  exit 1
end

print_only = ARGV.include?("-n")
TagSynchronizer.remove_unused_tags(print_only)

Git изначально поддерживает очистку локальных тегов:

git fetch --tags --prune

эта команда извлекает последние теги и удаляет все удаленные теги.

Как насчет этого-отбросьте все локальные теги, а затем повторно извлеките? Учитывая, что ваше РЕПО может содержать подмодули:

git submodule foreach --recursive  'git tag | xargs git tag -d'
(alternatively, "for i in `find .git  -type d -name '*tags*'`; do rm -f $i/*;  done")
git fetch -t
git submodule foreach --recursive git fetch -t

TortoiseGit теперь может сравнивать теги.

левый журнал находится на удаленном, правый-на локальном.

enter image description here

использование функции сравнения тегов диалогового окна синхронизации:

enter image description here

см. Также TortoiseGit выпуск 2973

Comments

    Ничего не найдено.