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ブランチができあがる、と言うわけです。