リモートで消えたタグをローカルに反映するにはどうすればいいか

  • Git

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

リモートリポジトリでタグを削除しても、ローカルには残ったままになる。git fetch は基本的にタグを追加する方向にしか動かないので、リモートで消したタグをローカルからも消すには一手間必要だった。

やりがちな方法

ローカルのタグを一度全部消してから、リモートのタグを取り直す。

ターミナル
git tag -d $(git tag -l)
git fetch origin --tags

git tag -d $(git tag -l) でローカルタグを全削除し、git fetch origin --tags でリモートに存在するタグだけを取得し直す。結果的にリモートの現状と一致する。

ただしタグが1つもない状態で git tag -d を引数なしで実行するとエラーになる。空リポジトリや既にタグが無い状態でこのコマンドを流すスクリプトを書く場合は注意が要る。

もっと素直な方法

ターミナル
git fetch origin --prune --prune-tags

これで、リモートで消えたタグはローカルからも削除され、残っているタグは取得される。全消しして取り直すのと同じ結果になるが、他の参照(ブランチなど)に影響を与えず、タグ以外の余計な削除・取得処理も走らない分速い。

--prune-tags は Git 2.17(2018年4月リリース)以降で使える。それより古い Git を使っている環境でなければ、こちらを使う方が安全。

何が違うか

  • tag -d 全消し→fetch --tags:一旦ローカルのタグを全て破棄してから再取得するので、途中の状態としては「タグが1つもない」瞬間ができる
  • fetch --prune --prune-tags:差分だけを見て、消すべきものを消し、足すべきものを足す

普段使いなら後者で十分そうだった。