編集、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つずつ)追加され、事前受信フックまたは更新フック、あるいはその両方(リモートに存在するフック)に配信されます。これらのフックは、タグの作成/削除/更新を許可するか拒否するかを決定できます。
old-sha1
タグが作成されている場合、値はすべてゼロ「ヌル」SHA-1です。new-sha1
タグが削除されている場合、これはnull SHA-1です。それ以外の場合、両方のSHA-1値は実際の有効な値です。
フックがない場合でも、実行される一種の「組み込みフック」があります。「force」フラグを使用しない限り、リモートはタグの移動を拒否します(「組み込みフック」は常に両方ともOKですが) 「追加」と「削除」)。表示されている拒否メッセージは、この組み込みフックからのものです。(ちなみに、この同じ組み込みフックは、早送りではないブランチの更新も拒否します。)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
ローカルリポジトリでのタグの有無は関係ありません。この種のはpush
、refspecとして、純粋な削除プッシュです。:remoteref
リモートは、タグの削除を許可する場合と許可しない場合があります(追加のフックに応じて)。削除が許可されている場合、タグは削除されます。2つ目はgit push --tags
、dev
コミットまたは注釈付きのタグリポジトリオブジェクトを指すローカルタグがある場合、新しいdev
タグを送信します。リモートでdev
は、新しく作成されたタグになるので、リモートはおそらくプッシュを許可します(これも追加のフックに依存します)。
フォースプッシュはより簡単です。あなたが更新何にもわからないようにしたい場合は、他のタグよりも、ただ伝えるgit push
だけで1 refspecをプッシュします:
git push --force origin refs/tags/dev:refs/tags/dev
(注:--tags
1つのタグref-specのみを明示的にプッシュする場合は必要ありません)。
1もちろん、この組み込みフックの理由は、同じリモートリポジトリの他のユーザーが期待する動作を強制するためです。つまり、ブランチは巻き戻されず、タグは移動しません。強制的にプッシュする場合は、これを実行していることを他のユーザーに知らせて、他のユーザーが修正できるようにする必要があります。「タグはまったく動かない」はGit 1.8.2によって新たに強制されていることに注意してください。以前のバージョンでは、ブランチ名のように、タグがコミットグラフ内で「前進」することができました。git 1.8.2リリースノートを参照してください。
2リモコンでログインできる場合は簡単です。そこでGitリポジトリに移動して実行しgit tag -d dev
ます。いずれかの方法(リモートでタグを削除するか、それを使用git push
して削除する)のいずれかに、リモートにアクセスする誰かがdev
タグが欠落していることに気付くことがあります。(彼らがすでに持っている場合、彼らは彼ら自身の古いタグを持ち続けます、そして彼らはあなたが新しいものをプッシュすることができる前に彼らの古いタグを元に戻すことさえするかもしれません。)