ejo090の日記

みなさんの数分を無駄にするように毎日がんばります。コメントあると中の人めっちゃ喜びます。

git fetchした時に既に削除されているリモートブランチがローカルにそのまま残り続けるのつらい

おひさしぶりです。

Git/Githubを使って多人数で開発をしていると、「リモートでは削除されているのにローカルに残り続けているのでgit branch -aとかやるととんでもない量のブランチが表示される」という事案が発生します。

私は当該リモートブランチにcheckoutして動作を確認したりテストが通るかどうか試したりするため、基本的にgit fetchを多用します。
git fetchは基本的にリモートにあるブランチ類をローカルブランチにインポートするコマンドですが、「インポート」なのでローカルにリモートのブランチはたまり続けます。
git fetchはリモートからブランチが消えた時にローカルと同期を取って消してくれるという優しさは持ち合わせてるわけではないんですね。

そこで調べると、やはりありました。 Git - git-fetch Documentation git fetchのオプションとして-pまたは--pruneが用意されています。

After fetching, remove any remote-tracking references that no longer exist on the remote. Tags are not subject to pruning if they are fetched only because of the default tag auto-following or due to a --tags option. However, if tags are fetched due to an explicit refspec (either on the command line or in the remote configuration, for example if the remote was cloned with the --mirror option), then they are also subject to pruning.

つまり、fetch後にリモートに参照先がないオブジェクトの場合は消してしまうというものです。
これでとりあえずリモート上では消されたはずの数多くのブランチは消えます。

ただ、fetchするときにgit fetch -pとかいちいち-p打つのめんどくさくない?alias設定しろよ そこで探しているとこんな記事を見つけました。

Gitのfetch/pullサブコマンドで--pruneオプションをデフォルトにする - Weblog - Hail2u.net

しゅごい。
これでただ単にgit fetchしただけで自動的に-pされることになります。

ここまで書いて気づいたのですが、もしかして「リモートでは既に消されてしまったが、もしかしたらあのブランチの方がよいかもしれない。君、git fetchしていたよね。あのブランチをpushしてもらえないか?」という状況ももしかしたらある……????

じゃぁ!