git push時に403エラーが返ってくる際の対処法

gitでプロジェクトを管理する際、ローカルリポジトリに変更を加えてテストを行い、
上手くいくことを確認できれば、リモードのリポジトリにpushすると思います。

しかし、pushの際に403エラーが返ってきてしまうことが最近起きましたので、
その対処法についてメモしていきます。

遭遇したエラー

ローカルのリポジトリに変更を加え、
git add, git commitを済ませ、最後にリモートリポジトリにプッシュすると思います。
以下のコマンドのようにリモートリポジトリにプッシュを試みると、、、

$ git add --all
$ git commit -m "comment"
$ git push origin master

このようなエラーメッセージが表示されることがありました。

remote: Permission to user/repo.git denied to hogehoge.
fatal: unable to access 'https://github.com/user/repo/':
The requested URL returned error: 403

‘https://github.com/user/repo/’にアクセスすることができません。
リクエストが403エラーとなっています。

このようなエラーが帰ってきたときの対処法について書き留めていきます。

問題の原因

このような問題が生じた原因ですが、私の場合は、、、

  • 1台のPCで複数のgitアカウントのリポジトリを管理していた。
  • Mac OS X のキーチェーンアクセスが悪さをしていた。

以上の2点が原因でした。

通常、git pushを行う際には以下のようにユーザ名とパスワードの入力が求められます。

$ git push origin master
Username for 'https://github.com': <username>
Password for 'https://strymj@github.com': <password>

Mac OSではないOSでリモートリポジトリにpushを試みる場合、例えばubuntuでは上記のように毎回ユーザ名とパスワードの入力が行われます。
しかし、Mac OSに備え付けられたgitの場合、パスワードを記憶してくれるキーチェーンアクセスというアプリケーションが自動でパスワードを入力してくれるため、pushの際にパスワードの入力を省くことができます。
(というか、強制的にパスワードの入力がスキップされます。)

この機能がとても便利なのですが、、、この機能が複数のgitアカウントのリポジトリを管理する際に弊害になっていたのでした。

例えば、Aというgitアカウントと、別のBというアカウントを同じMac OSで使用するとします。
先にAのリモートリポジトリにpushした場合、MacのキーチェーンアクセスがAのgitアカウントのユーザ名とパスワードを記憶します。
次にBのリモートリポジトリにpushを試みると、キーチェーンアクセスは先ほど記憶しておいたAのアカウントのユーザ名とパスワードを用いてBのリモートへのpushを試みるというわけなのです。

403エラーの対処法

そこで、一時的にgitアカウントBのリポジトリにpushしたい場合には、
MacのキーチェーンアクセスからgitアカウントAのパスワード情報を削除してしまいます。

キーチェーンアクセスは、Mac OSのアプリケーション一覧から探すことができます。

キーチェーンアクセスを起動すると、以下のような画面となりますので、
右上の検索窓にgitと入力して検索をかけます。

検索をかけたら、該当するgithub.comのログインパスワードを消去します。
消去したら、もう一度git pushを行います。

すると、今度は403のhttpリクエストエラーではなく、
ユーザ名とパスワードの入力が求められると思います。

そこに正しいユーザ名とパスワードを入力すれば、無事Bのgitアカウントにpushできていると思います。

また、Aのgitアカウントに戻したい場合は、再度キーチェーンアクセスのログインパスワードを消去すれば良いですね。

pushの際にキーチェーンアクセスを使用しないようにする

上記の方法では、別のリポジトリを使用する時に以前使っていたキーチェーンアクセスのgitパスワードを破棄していました。
一時的に普段使いではない別のgitリポジトリを使用する際は、上記のような方法が有効ですが、頻繁に異なるリポジトリを編集する際はそんなことを指定ては面倒です。

そこで、恒久的にキーチェーンアクセスに夜パスワード入力を無効にしてみます。

キーチェーンアクセスのgithubの欄から「情報を見る」を選択し、

これらのアプリケーションによるアクセスを常に許可:
に追加されているgit-credential-osxkeychainを(−)ボタンで消去します。

この状態でgit pushを試みると、、、

このようにキーチェーン内のパスワードを使用しますか?と聞かれるようになるので、
拒否してしまえばキーチェーン内のパスワードは使用されず、
コンソール内でパスワード入力を求められるようになります。

以上、git push時に404エラーが生じた際の対処法でした。