gitでtagを変更する方法(ワンライナーで一括変更)

gitでtagの名前を変更する方法をまとめます

の二つを紹介します

簡単な例

  • 変更前のタグを old
  • 変更後のタグを new
  • リモートのリポジトリを origin

とすると,oldをnewに変更するコマンドは以下の三つになります

$ git tag new old           
$ git tag -d old           
$ git push origin new :old

上から順番に説明すると

  1. old を newにコピー
  2. oldを削除
  3. oldの削除と newの作成を origin にpush

となります

1と2はローカル側の変更,3はそれをリモート側に反映させるコマンドです.3をやらないとリモート側にoldのタグが残ったままになるので, git pull --tag とするたびに,ローカル側で消したはずのtag ( old )が復活します

応用:複数のタグを一括で置き換える方法

bashワンライナーで複数のタグをまとめて置換します

タグの一覧の取得

tmpfile というファイルを作成して,タグの一覧を保存します

$ git tag -l > tmpfile
tmpfile の修正

tmpfileには,1行ごとにタグが保存されます

例えば

$ cat tmp file
tag1
tag2
tag3

という感じで tag1, tag2, tag3 の合計三つのタグがあったとして,これをそれぞれtagA,tagB,tagCに置き換えたい場合は次のように tmpfileを修正します

tag1  tagA
tag2  tagB
tag3  tagC
tagの確認

tmpfileの内容は,各行に old new の順番で文字列を記載したフォーマットになります.試しにbashワンライナーで内容を確認してみます

$ cat tmpfile | while read old new; do echo $old $new; done
tag1  tagA
tag2  tagB
tag3  tagC
git のコマンド実行(その1)

ワンライナーを加工して,gitのコマンドを実行していきます

最初は git tag new old を実行します

慣れないうちは echo git tag ... という形で実行するコマンドを一度画面に表示してみて,内容を確認すると良いです

$ cat tmpfile | while read old new; do echo git tag $new $old; done
git tag tagA tag1
git tag tagB tag2
git tag tagC tag3

問題なければ echoを外して,実際にgitコマンドを実行します

$ cat tmpfile | while read old new; do git tag $new  $old; done
gitのコマンド実行(その2)

次は git tag -d old を実行します

$ cat tmpfile | while read old new; do git tag -d  $old; done
gitのコマンド実行(その3)

最後に git push origin new :old を実行します

$ cat tmpfile | while read old new; do git push origin $new :$old; done