Bareリポジトリのmasterブランチを削除する
はいっ。こんなことをするシチュエーションはほとんど考えられないですが、つい今日、そういうシチュエーションがあって、どのように対応すべきかよくわからなかったので、メモがてら書いておきます。
シチュエーション
私の開発環境は、メインはMacBook Proなのですが、数値計算のプログラムを走らせるためには、MBPではキツクて、やはり大容量のメモリマシンに持っていく必要があります。
その時に、同期をするのに、サーバーマシン上にgitのBareリポジトリを置いています。
ちなみに、マスターのリポジトリはsvnでそこにみんなcommitしております。
そんなとき(特にマスターのsvnリポジトリから、git svn rebaseで最新のコミットを取り込んだ時)、git pushで上流に上げても、Fast Forwardではないため、mergeが必要になってしまいます。
ところが、そんなのめんどくさい。ということで、上流のリポジトリのmasterブランチを削除して、git pushでmasterを上げたいと言うのが動機です。
やり方
とりあえず、gitのBareリポジトリに移動
% cd
% git branch
* master
と言う具合になっているところで、おもむろにmasterブランチを消そうとすると、
% git branch -d master
error: Cannot delete the branch 'master' which you are currently on.
と、「今そのブランチにおるくせに消せるかー」と怒られます。
仕方が無いので、新たにブランチを作って、checkoutしようとすると、
% git branch master.yymmdd
% git checkout master.yymmdd
fatal: This operation must be run in a work tree
とこれまた、「Work Treeじゃないのに、checkoutできひんわ」と怒られます。
しかし、gitのbranchは所詮はポインタであることから、HEADのリファレンス先を直接変えることができます。
% git symbolic-ref HEAD refs/heads/master.yymmdd
% git branch
* master.yymmdd
master
そして、あとはmasterブランチを削除。
% git branch -d master
% git branch
* master.yymmdd
と言う感じ。あとは、下流からmasterブランチにpushすれば、またmasterブランチができあがる、と言うわけです。