Windowsで複数のGitHubアカウントを切り替えてpushしようとしたら、「remote: Permission to ユーザー名/レポジトリ名.git denied to 別のユーザー名.」で困った


複数のGitHubアカウントを切り替える


Windowsで複数のGitHubアカウントを切り替えてpushしようとしたら、「remote: Permission to ユーザー名/レポジトリ名.git denied to 別のユーザー名.」というエラーが出て困ったという話です。




Gitはじめました


遅ればせながら、最近Gitを使うようになりました。といっても、ローカルのバージョン管理とGitHubにあげてみるくらいしかやっておらず、Issuesとかbranchとかプルリクとかは全く分からないレベル。


それでも、ローカルのバージョン管理は便利だし、GitHub上にあげることでバックアップにもなるので便利だなーって思っています。


さらに最近、GitHubでは有料だった複数のプライベートリポジトリが無料になりました。初心者としては会社で使って変なものをパブリックで公開するとまずいと思ってビクビクして使えなかったのですが、思う存分プライベートリポジトリにすることで、少し安心して使えるようになりました。


使っていると、複数のGitHubアカウントを切り替えて使いたくなりました。


その方法を調べてみると、どうやら結構めんどくさいらしいということがわかりました。でもやるしかない…


設定してみる


まずこちらを参考に、「ssh」ではなく「https」を使うことにしました。GitHubでも「https」を推奨しているし。

GitHubの複数アカウントを使い分けるならSSHよりhttpsの方がいいんじゃね?という話
https://qiita.com/zaki-yama/items/bfb0c2bef516af58c3fa


まずは、config --globalに設定したメールアドレスとユーザー名を削除しました。

git config --global --unset user.email
git config --global --unset user.name



削除後のconfig内容を確認します。

git config --global -l


core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
diff.astextplain.textconv=astextplain
rebase.autosquash=true
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
credential.helper=manager



そして、もともとあったアカウントで使用していたレポジトリをクローンします。
その時に、ユーザー名を指定してgit cloneします。

httpsのURLはGitHubの以下からコピーします。

レポジトリが初期状態のとき


レポジトリが初期状態ではないとき


一つ目のレポジトリ


まずは一つ目のレポジトリ。

git clone https://ユーザー名@github.com/ユーザー名/リポジトリ名.git

Cloning into 'リポジトリ名'...
remote: Enumerating objects: 33, done.
remote: Counting objects: 100% (33/33), done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 33 (delta 4), reused 31 (delta 2), pack-reused 0
Unpacking objects: 100% (33/33), done.

無事、ローカルにcloneできました。


現状のremote url設定を確認。

git remote -v


すでにクローンしてある場合は、以下のコマンドで変更可能。

git remote set-url origin https://ユーザー名@github.com/ユーザー名/リポジトリ名.git


config --localのremote.origin.urlを確認します。

git config --local -l


core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://ユーザー名@github.com/ユーザー名/リポジトリ名.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master


一つ目のレポジトリにテストでコミットしてみます。

git commit -m "test commit"


--globalのメールアドレスとユーザー名を削除したので、途中で入力を促されます。

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '----------.(none)')

git config --local user.email "メールアドレス"

git config --local user.name "ユーザー名"


現状のconfig --localを確認。

git config --local -l


メールアドレスとユーザー名が指定されていることを確認できます。
ちなみに、この状態でもconfig --globalは空の状態です。

core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://ユーザー名@github.com/ユーザー名/リポジトリ名.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
user.email=メールアドレス
user.name=ユーザー名


再度コミットしてみます。

git commit -m "test commit"


すると、以下のような別ウィンドウが立ち上がり、ユーザー名とパスワードの入力を求められます。



無事コミット出来ました。

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean


Pushもしてみます。

git push origin master


無事プッシュ出来ました。

Everything up-to-date


2回目のコミットからは別ウィンドウが立ち上がらずパスワードのみの入力で可能です。


二つ目のレポジトリ


続いて、二つ目のレポジトリをクローンします。

一つ目と異なる別のユーザー名を指定してクローンします。

git clone https://別のユーザー名@github.com/別のユーザー名/別のリポジトリ名.git



無事クローン出来ました。

Cloning into '別のリポジトリ名'...
warning: You appear to have cloned an empty repository.


config --localのremote.origin.urlを確認します。

git config --local -l


core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
remote.origin.url=https://別のユーザー名@github.com/別のユーザー名/別のリポジトリ名.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master


レポジトリに何もないので、README.mdを作成してみます。

echo "# 別のリポジトリ名" >> README.md


二つ目のレポジトリにもテストでコミットしてみます。

git add .
git commit -m "test commit"


一つ目と同様に、メールアドレスとユーザー名の入力を促されます。
ここで、二つ目の別のメールアドレス、別のユーザー名を指定します。

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '----------.(none)')

git config --local user.email "別のメールアドレス"

git config --local user.name "別のユーザー名"



再度コミットします。

git commit -m "test commit"


無事コミット完了です。
[master (root-commit) 8a7d294] test commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md


Pushしてみます。

git push origin master


ここでエラー


ここで以下のエラーが出てはまりました。

remote: Permission to 別のユーザー名/別のリポジトリ名.git denied to ユーザー名.
fatal: unable to access 'https://別のユーザー名@github.com/別のユーザー名/別のリポジトリ名.git/': The requested URL returned error: 403



一つ目と二つ目、ちゃんとユーザー名を指定したのにもかかわらず、二つ目のリポジトリをプッシュしようとすると、「一つ目のユーザー名をしようしているからアクセスする権限がないよ」というエラーが出ています。

なぜだー


状況確認


現在Gitを利用している端末は、OSがWindows10 Homeです。


Gitは、Git for Windowsを使用しています。
https://gitforwindows.org/





そもそも、Gitのユーザー名ってgit config --globalとgit config --local以外にあるとしたら、どこで管理しているのだろうか?


エラーで検索したところ、パスワードなんかはローカル端末自体にキャッシュしているようだ。

…なんとなく、Windowsの問題のような気がしてきた。


あと、一つ目で出たこの画面




が、二つ目の時は出なかった。


ということは、一つ目の認証情報が残っているということか!

で、その認証情報ってどこにあるのさ?



と調べていると、以下が参考になりました。

windows - 変更 認証情報 Gitから資格を削除する
https://code.i-harness.com/ja-jp/q/eab2ce


なんと、Windosの資格情報。

コントロールパネル → ユーザーアカウント → 資格情報マネージャー → Windows資格情報



ここにgithubの認証情報が残っています。

これを削除することで、二つ目のときにでたエラーが出なくなります。

もしくは事前に変更をすればよいとのこと。



切り替えるたびに


問題は解決しました…が、切り替えのたびにこれをやらなくてはいけません。



まあ、そんなに頻繁にリポジトリの切り替えはしないからいいのですが。

他になにかよい方法はないのでしょうか?



コメント

このブログの人気の投稿

SEから経理へ転職できるのか?

新入社員のパソコンは新品がいいのか?