2017-05-15 6 views
3

ライトウェイトタグを使用せずに、ローカルリポジトリのすべての注釈付きタグをリモートにプッシュするにはどうすればよいですか?注釈付きタグをすべてプッシュするには?

私はプッシュしたくないローカルの軽量タグを使用していますので、git push --tagsは解決策ではありません。

私はgit push --follow-tagsを認識していますが、それは現在プッシュされているコミットに関連するタグだけをプッシュします。

私の通常のワークフローは時々押すが、リリースを完成させるときにはタグ付けするだけなので、タグをプッシュすることを忘れることがあるので、このオプションが必要です。この問題は、しばしば検出されなくなり、他の開発者と少し混乱します。なぜなら、タグとの同期が外れるからです。 注釈付きタグを一覧表示するには複雑だので

がリモートでローカルに存在ではなく、私はすべての開発者のローカルおよびリモートリポジトリが同じに注釈を付けていることを確認するであろう、ちょうどすべてのローカル注釈付きのタグを押すことで、この問題を解決したいと思いますタグ。

答えて

4

それほど難しくありません。最初にの注釈付きタグを見つけます(注釈付きタグオブジェクトではなくコミットに直接向いているタグを拒否することによって)。

list_annotated_tags() { 
    git for-each-ref --format '%(objecttype) %(refname)' refs/tags | 
     while read reftype refname; do 
      case $reftype in tag) echo $refname;; esac 
     done 
} 

は、上記の出力を読み、git pushコマンドにrefspec引数としてそれらを使用する:これは、シェルの機能としてそれを書きたいかもしれないので、少し長いです

git push origin $(list_annotated_tags) 

とあなたのスクリプトは完了です。

1

軽量タグにtaggerdateが含まれていないことに気付きました。その場合には、これは、コマンドラインまたはスクリプトで動作します:

続い
taglist=`git for-each-ref refs/tags --format '%(refname:short) %09 %(taggerdate:short)' | \ 
grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' | \ 
cut -f 1 | \ 
tr '\n' ' '` 

:興味を持っている人のため

git push origin $taglist 

コマンドの要約:

  • 1行目 - git for-each-refタグリストを取得し、タグ名、タブ、および日付を表示するようにフォーマットします。
  • 2行目 - grepコマンドは、1番目のコマンドの結果を検索し、日付の付いたタグだけを取り出します。
  • 3行目 - cutコマンドは、最初の列の後にあるすべての項目を削除します(つまり、各タグ名に続くタブの前から、各結果行の末尾にあるnewlineまで)。
  • 4行目 - trコマンドは、newlineを最終結果のスペースで置き換えます。 (タグ名は、スペースで区切られ、一行になりました。)

結果を変数に格納されている(taglist - taglist=次全体コマンドセットの最初と最後にバッククォートを注意してください)。

最後に、$を使用してタグリストを起点にプッシュし、taglistが変数であることを示します。

関連する問題