空リポジトリ (init)
リモートから master ブランチを削除するとは以下のようにするということである。この時の操作はリモートからエラーメッセージが帰ってきて失敗する。
$ git push origin :master Enter passphrase for key '***********************': remote: error: By default, deleting the current branch is denied, because the next remote: error: 'git clone' won't result in any file checked out, causing confusion. remote: error: remote: error: You can set 'receive.denyDeleteCurrent' configuration variable to remote: error: 'warn' or 'ignore' in the remote repository to allow deleting the remote: error: current branch, with or without a warning message. remote: error: remote: error: To squelch this message, you can set it to 'refuse'. remote: error: refusing to delete the current branch: refs/heads/master To ******************************************************************************************** ! [remote rejected] master (deletion of the current branch prohibited) error: failed to push some refs to '********************************************************************************************'
この時のリモートの状態を確認すると以下。HEADブランチがmasterを指している事がわかる。git clone の時に checkout されるブランチは HEAD の指すブランチなので、リモートから master が削除されると、このリポジトリを clone した時に checkout されるブランチがなくなって混乱のもとになる。このため上のエラーが出ているわけだ。
$ git remote show origin Enter passphrase for key '***********************': * remote origin Fetch URL: ******************************************************************************************** Push URL: ******************************************************************************************** HEAD branch: master Remote branches: master tracked Local ref configured for 'git push': master pushes to master (up to date)
どっちかといえばリモートのmasterをローカルから消せないほうがどうかと思うので、リモートにログインしてベアリポジトリのディレクトリまで移動して、以下のコマンドを実行。これで、上のメッセージで要求されている作業が完了した。
$ git config receive.denyDeleteCurrent warn $ git config --list core.repositoryformatversion=0 core.filemode=true core.bare=true receive.denydeletecurrent=warn
こうすればローカルからリモートの master ブランチを削除できる。
$ git push origin :master Enter passphrase for key '***********************': remote: warning: deleting the current branch To ******************************************************************************************** - [deleted] master
リモートで行った変更を元に戻しておく。
$ git config --unset receive.denyDeleteCurrent $ git config --list core.repositoryformatversion=0 core.filemode=true core.bare=true
リモートの master を削除するもう一つの方針として、HEAD の指す先を変える方針を取ることも可能。リモートで HEAD の指す先を dummy ブランチにするには以下。github はリモートにログインできないが、webインターフェースからHEADの指す先(カレントブランチ)を切り替えることができる。
$ git symbolic-ref HEAD refs/heads/dummy $ cat HEAD ref: refs/heads/dummy
この状態でローカルからリモートリポジトリの状態を確認すると以下。HEAD の指す先は(unknown)になっている。
$ git remote show origin Enter passphrase for key '***********************': * remote origin Fetch URL: ******************************************************************************************** Push URL: ******************************************************************************************** HEAD branch: (unknown) Remote branches: master tracked Local ref configured for 'git push': master pushes to master (up to date)
以下のようにすれば、ローカルからリモートのmasterを削除できたことがわかる。
$ git push origin :master Enter passphrase for key '***********************': To ******************************************************************************************** - [deleted] master