リモートのタグを一括削除するときは–deleteを使おうと思った話

LINEで送る
Pocket

この記事は12/19のGit Advent Calendarの記事です。

ひょんなことから、リモートのGitサーバにある4000個のタグを一括削除することになりました。

タグ消すときはgit push origin :タグ名でタグを消してたのですが、 4000個もあると丸一日待っても終わらないので、他に素早く消せる方法はないだろうか、 とコマンドを探していたら良いものを見つけた、という備忘録です。

※タグについて書きますがブランチにおいても同様です。

git push origin :タグ名

:は区切り文字に相当しており、おそらく普段使っているように省略すると

のように扱われています。 これを応用すればローカルとリモートで異なるブランチ名にpushできるのですが、そんなことする得が無いので基本省略すると思います。

> : part can be omitted—​such a push will update a ref that normally updates without any on the command line. Otherwise, missing : means to update the same ref as the . > — Git – git-push Documentation

で、:を付けて左側に何も書かないと、「無とpushする」みたいな動作になります。 これに関しては、どこぞのTAS動画で「無を掴む」とか表現されたりするように、概念的に理解しようとするより、結果論で覚えたほうが早いと思います。

> Pushing an empty allows you to delete the ref from the remote repository. > — Git – git-push Documentation

git push origin –delete タグ名

git push --delete origin hogehoge のようなコマンドを叩くとリモートブランチが削除されます。

> –delete > All listed refs are deleted from the remote repository. This is the same as prefixing all refs with a colon. > — Git – git-push Documentation

ただ、どうにも遅い。なんとかできないか調べてました。

push時に複数ブランチ・タグが指定できる

git-pushは複数のブランチを一気にpushすることが可能だったようです。試したことがなかった。

git push origin :hoge :foo :barのようにやれば、複数のブランチ・タグを一括削除できます。 もしくは--deleteオプションをつけても内部挙動としては同じです。 1個ずつ指定していく場合と比べてめちゃくちゃ早いです。

どれくらい違うのか

タグを100個切ってリモートにあげてから、それを全部削除するまでの時間を図ってみました。 ネットワーク状況の揺れを最小限にするよう有線で試しましたが、それでも誤差はあると思います。

方法 時間
1個ずつ+: 8m40.951s
1個ずつ+--delete 8m35.192s
一括+: 0m14.854s
一括+--delete 0m4.338s

はい、結果は歴然です。 一括削除したほうが圧倒的に早いです

まとめ

私は、破壊的な操作をショートハンドでやるのは怖い(1文字オプションも見間違い・勘違いが怖いので使わない)と思っているので、 セーフティという意味では十分意図通りの挙動と安全性を提供してくれていると思います。

ということで、これからはリモートにあるブランチやタグを一気にを消すときは--deleteオプションを愛用すると思います。

LINEで送る
Pocket