綾小路龍之介の素人思考

[git] リモート側 HEAD の指すブランチを書き換える

通常は HEAD は master ブランチを指しているが、これを切り替えたい。これはgit push origin :masterなどをやってそれが成功してしまったおかげで、いろいろと問題が生じている場合に必要。

空リポジトリ (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

リファレンス

  1. remote - How do I delete origin/master in Git - Super User
  2. Git - git-config Documentation

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-03-27T07:43:05+09:00
  2. Modified: 2008-03-27T07:43:05+09:00
  3. Generated: 2019-02-11T23:09:13+09:00