578

デプロイ プロセスの一環として、git でタグを使用します。時々、これらのタグをリモート リポジトリから削除してクリーンアップしたいと考えています。

これは非常に簡単です。1 人のユーザーが、1 組のコマンドでローカル タグとリモート タグを削除します。両方の手順を組み合わせた小さなシェル スクリプトがあります。

2 番目 (3 番目、4 番目、...) のユーザーには、リモートに反映されなくなったローカル タグがあります。

git remote prune originリモートブランチが削除された追跡ブランチをローカルでクリーンアップするのに似たコマンドを探しています。

または、リモート タグを一覧表示する単純なコマンドを使用して、 経由で返されたローカル タグと比較することもできますgit tag -l

4

16 に答える 16

1258

これは素晴らしい質問です、私は同じことを疑問に思っていました。

スクリプトを書きたくなかったので、別の解決策を探しました。重要なのは、タグをローカルで削除してから、gitfetchを使用してリモートサーバーから「元に戻す」ことができることを発見することです。タグがリモートに存在しない場合、タグは削除されたままになります。

したがって、2行を順番に入力する必要があります。

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

これらは:

  1. ローカルリポジトリからすべてのタグを削除します。FWIW、xargsは、「tag-l」によって出力された各タグを「tag-d」のコマンドラインに配置します。これがないと、gitはstdin(silly git)を読み取らないため、何も削除されません。

  2. リモートリポジトリからすべてのアクティブなタグを取得します。

これは、Windowsでも扱います。

于 2011-03-21T02:42:46.070 に答える
189

リモートに存在するタグのみが必要な場合は、すべてのローカル タグを削除します。

$ git tag -d $(git tag)

そして、すべてのリモート タグを取得します。

$ git fetch --tags
于 2014-10-09T15:40:40.170 に答える
85

v1.7.8 以降の Git のすべてのバージョンは refspec を理解git fetchしますが、v1.9.0 以降では--tagsオプションがオプションをオーバーライドし--pruneます。汎用ソリューションの場合は、これを試してください。

$ git --version
git version 2.1.3

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

Git v1.9.0 で「--tags」と「--prune」の動作がどのように変化したかについて詳しくは、https ://github.com/git/git/commit/e66ef7ae6f31f246dead62f574cc2acb75fd001c を参照してください。

于 2014-12-02T16:42:48.517 に答える
84

良い質問。:) 完全な答えはありません...

とはいえ、リモート タグのリストは を介し​​て取得できます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
于 2009-12-04T15:43:17.487 に答える
14

Git はローカル タグのクリーンアップをネイティブにサポート

git fetch --tags --prune-tags

このコマンドは、最新のタグを取り込み、削除されたすべてのタグを削除します

于 2018-04-06T19:32:01.867 に答える
3

GitHub の pivotal_git_scripts Gem フォークに git sync-local-tags コマンドを追加しました。

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 $2}'`.split(/\n/)
  end

  def self.remote_tags
    `git ls-remote --tags origin | awk '{print $2}'`.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)
于 2010-12-14T20:57:49.943 に答える
1

TortoiseGit はタグを比較できるようになりました。

左のログはリモート、右はローカルです。

ここに画像の説明を入力

同期ダイアログのタグ比較機能の使用:

ここに画像の説明を入力

TortoiseGit issue 2973も参照してください

于 2017-07-14T09:12:39.097 に答える
1

これはどうですか - すべてのローカル タグを削除してから、再度フェッチしますか? レポにサブモジュールが含まれている可能性があることを考慮してください。

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
于 2014-09-09T19:34:34.500 に答える