0

Maven release-plugin を使用しているときに、git タグの問題に直面しています。の間、git への自動プッシュをオフにしmvn release:performました。新しいリリースをビルドするために次のことが行われます。

  1. リモート git リポジトリから最新の変更をプルします。
  2. mvn release:prepare
  3. mvn release:perform
  4. git push origin master
  5. git push --tags

このシナリオは機能し、コミットはタグ付けされ、すべて問題ありません。ただし、このシナリオでは、タグが失われます。

  1. リモート git リポジトリから最新の変更をプルします。
  2. mvn release:prepare
  3. 誰かがマスターにコミットをプッシュしました!
  4. mvn release:perform
  5. git push origin master-- 新しいコミットが入っているため、機能しません。
  6. git pull --rebase origin master
  7. git push origin master
  8. git push --tags

Git は、新しいタグがプッシュされたと述べていますが、私 (ビルドを作成した人) 以外はそれらを使用できず、使用時にも表示gitkされないため、すべての実際の使用ではタグが失われます。

これは git のバグですか、それとも使用上のエラーですか (ビルド時にコミットが入らないようにするのは私たちの責任ですか)?

4

3 に答える 3

3

他の人がすでに述べたように、問題は、リベース後に新しいコミット ID を指すようにタグが自動的に更新されないことです。

これを回避する簡単な方法の 1 つは、 rebaseの代わりにmergeを使用することです。その後、コミットは変更されず、タグは引き続き正しいコミットを指します。

あなたの間接的な質問に: 他の人が古いタグを「見ない」理由は、Git はデフォルトで、フェッチされたコミット (フェッチされたブランチなど) から到達可能な場合にのみタグをフェッチするためです。すべてのタグを取得するには、次を使用します。

git fetch --tags

これによりタグが取得されますが、古い (リベース前の) コミットを指し示したままになります。

于 2013-03-11T16:13:18.347 に答える
1

使い方の間違いです。タグは、SHA1 ハッシュによって識別される特定のコミットを参照します。入力するとき

git pull --rebase origin master

masterローカルの変更がリモートブランチの新しい状態に基づいて構築されるように、履歴を書き換えています。タグ付けしたコミットは、この履歴にはもう存在しませんが、使用gitk --allすることで、ローカル リポジトリの別の履歴にまだ存在していることを確認できるはずです。

master複数の開発者からプッシュされたコミットに対して開かれているだけでなく、リリースのタグ付けに直接使用されるブランチを持つことは、おそらく間違いです。代わりに、このワークフローのように、リリースごとに新しいブランチを作成できます。

于 2013-03-11T12:46:07.350 に答える
1

他の回答で言われているように、リベースは履歴を台無しにしているため、タグは本来あるべき場所にありません。

今のところ、次のようにしてタグを取得できました。

ローカル git タグを削除します。 git tag -d nameoftag

リモート git タグを削除します (既にプッシュ済みです):git push origin :refs/tags/nameoftag

正しい場所に新しいタグを作成します: git tag nameoftag HEAD(SHA-ID の代わりに HEAD を使用できます)

最後に、タグをプッシュします。git push --tags

今は他の人が欠けているタグを楽しむことができますが、将来的には、リリースのために作成している電子メールを送信して、何かをプッシュする人にとって悲惨な結果になることを警告するだけだと思います.

于 2013-03-11T15:27:22.273 に答える