編集、2016 年 11 月 24 日: この回答は明らかに人気があるため、ここにメモを追加します。中央サーバーのタグを置き換えると、古いタグを持つ人 (タグを既に持っている中央サーバー リポジトリのクローン) は、古いタグを保持できます。したがって、これはその方法を示していますが、本当にやりたいことを確認してください。すでに「間違った」タグを持っているすべての人に、「間違ったタグ」を削除して、新しい「正しいタグ」に置き換える必要があります。
Git 2.10/2.11 でのテストでは、古いタグの保持が を実行しているクライアントgit fetch
のデフォルトの動作であり、更新が を実行しているクライアントのデフォルトの動作であることが示されていますgit fetch --tags
。
(元の回答は次のとおりです。)
タグのプッシュを要求すると、git push --tags
(必要なコミットやその他のオブジェクト、およびプッシュ設定からのその他の ref 更新とともに) フォームの更新要求がリモートに送信されます。(まあ、それはいくらでも送信します: 各タグのそれらの 1 つ。)new-sha1 refs/tags/name
更新要求はリモートによって変更されてold-sha1
(またはタグごとに 1 つ) 追加され、pre-receive および/または update フック (リモートに存在するフック) に配信されます。これらのフックは、タグの作成/削除/更新を許可するか拒否するかを決定できます。
old-sha1
タグが作成されている場合、値はすべてゼロの「null」SHA-1 です。new-sha1
タグが削除されている場合、これは null SHA-1 です。それ以外の場合、両方の SHA-1 値は実際の有効な値です。
フックがなくても、実行される一種の「組み込みフック」があります。「強制」フラグを使用しない限り、リモートはタグの移動を拒否します (ただし、「組み込みフック」は両方で常に問題ありません)。 「追加」と「削除」)。表示されている拒否メッセージは、この組み込みフックからのものです。(ちなみに、この同じ組み込みフックは、早送りではないブランチの更新も拒否します。) 1
しかし、これが何が起こっているのかを理解するための鍵の 1 つです。このgit push
ステップでは、リモコンが現在そのタグを持っているかどうか、もしそうなら、どのような SHA-1 値を持っているかを知りません。「これがタグの完全なリストとそのSHA-1値です」とだけ書かれています。リモートは値を比較し、追加や変更がある場合は、それらに対してフックを実行します。(同じタグの場合は何もしません。持っていないタグの場合も何もしません!)
タグをローカルで削除するとpush
、プッシュは単にタグを転送しません。リモートは、変更を行うべきではないと想定しています。
タグをローカルで削除し、新しい場所を指すタグを作成するとpush
、プッシュによってタグが転送され、リモートはこれをタグの変更と見なし、強制プッシュでない限り変更を拒否します。
したがって、次の 2 つのオプションがあります。
- 強制プッシュを行う、または
- リモコンのタグを削除します。
後者は、ローカルでタグを削除してing しても効果がない場合でも、 git push
2を介して可能です。リモートの名前が で、削除するタグpush
が であると仮定します。origin
dev
git push origin :refs/tags/dev
これにより、リモートにタグを削除するように求められます。dev
ローカル リポジトリにタグが存在するかどうかは関係ありません。refspec としてのこの種のはpush
、 pure-delete プッシュです。:remoteref
リモートは、タグの削除を許可する場合と許可しない場合があります (追加された追加のフックによって異なります)。削除が許可されている場合、タグはなくなり、2 つ目は、コミットまたは注釈付きのタグ リポジトリ オブジェクトを指すgit push --tags
ローカル タグがある場合に、新しいタグを送信します。リモートでは が新しく作成されたタグになるため、リモートはおそらくプッシュを許可します (これも、追加された追加のフックに依存します)。dev
dev
dev
強制プッシュはより簡単です。タグ以外を更新しないようにしたい場合は、git push
その 1 つの refspec のみをプッシュするように指示してください。
git push --force origin refs/tags/dev:refs/tags/dev
--tags
(注:タグ ref-spec を 1 つだけ明示的にプッシュする場合は必要ありません)。
1もちろん、この組み込みフックの理由は、同じリモート リポジトリの他のユーザーが期待する動作 (ブランチが巻き戻されず、タグが移動しない) を強制するのに役立つことです。強制的にプッシュする場合は、他のユーザーにこれを行っていることを知らせて、修正できるようにする必要があります。Git 1.8.2 では、「タグはまったく移動しない」が新たに適用されることに注意してください。以前のバージョンでは、ブランチ名と同じように、コミット グラフ内でタグを「前方に移動」できました。git 1.8.2 リリース ノートを参照してください。
2リモートでログインできれば簡単です。そこの Git リポジトリに移動して、 を実行するだけgit tag -d dev
です。リモコンでタグを削除するか、または を使用してタグを削除するかに関係なく、リモコンにアクセスした人がタグがないgit push
ことに気付く期間があることに注意してください。(彼らは独自の古いタグをdev
持っている場合は、引き続き古いタグを持ち、新しいタグをプッシュする前に古いタグをプッシュすることさえあります。)