@0913sigma

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

VSCodeからGitHubへのpushができなくなりました

エラー その1

VSCode で、Githubへのpushができなくなったのでssh鍵を登録?作成?しようとしていたところで問題が発生しました。
ssh-keygen は上手くいき、~/.ssh にファイルが生成されたのですが、
ssh-add -K ~/.ssh/github を実行したところ以下のエラーが出ました

Cannot download keys without provider

また、ssh-add (引数はなし)を実行すると以下のように表示されました

Identity added: C:\Users\PC名/.ssh/id_rsa (登録したメールアドレス)

あくまでも私は、githubへのpushができるようになれば良いので、sshの登録をしなくてもよいのならばその方法を教えていただきたいです。
もし鍵の登録が必須ならば、エラーの解決策、もしくは鍵を登録する別の方法を教えていただきたいです。

エラー その2

ちなみに、githubでsshの登録が必要になったのは昨日や今日の話ではないと思いますが、私がpushできなくなったのは、新しいアカウントでリポジトリを作った時からなので、それが影響していると思います。
pushしようとすると「GitHubで"リポジトリ名"にプッシュするためのアクセス許可がありません。代わりに、フォークを作成してそれにプッシュしますか?」と表示されます。
ところで、私はgithubのアカウントを二つ持っているのですが、現在苦戦している「pushできない方」をアカウントA、もう一つの方を アカウントB として話を続けます。
git push -u origin main を実行すると以下のメッセージが出ます。

remote: Permission to アカウントA/リポジトリ名.github.io.git denied to アカウントB.
fatal: unable to access 'https://github.com/ユーザー名/リポジトリ名.github.io.git/': The requested URL returned error: 403

なぜか アカウントB の名前が出てきてしまっています。書いているうちにこれが原因なんじゃないかなと思ってきましたが、エラーその1が解決できていないことも事実なので、一応書き残しておきます。

また、アカウントB のリポジトリにはpushできました。

長文になってしまいすみませんが、回答をよろしくお願いします。

1 likes

2Answer

ssh-add -K ~/.ssh/github

昔の macOS の ssh-add には独自の拡張として -K オプションがありましたが、削除されて今は無関係な -K オプションが追加されています。これは昔の意味で使っていると思われるので、オプションなしで ssh-add ~/.ssh/githubと実行すればいいです。

私がpushできなくなったのは、新しいアカウントでリポジトリを作った時からなので、それが影響していると思います。

新しいアカウントに今使っている SSH 鍵を登録していないのでは?

また、 push しようとしているリポジトリで git config -l | grep '^credential' を実行して credential.username=アカウントB とか credential.https://github.com.username=アカウントB のような値が表示される場合、アカウントAに設定する必要があります。 git config --local credential.username アカウントA を実行してください。

2Like

エラー その1 について

ssh-add -K ~/.ssh/github を実行したところ以下のエラーが出ました

-K オプションは mac 用のオプションのようですが、作業されている環境は mac でしょうか?
また、-K は Monterey (12.0) 以降は --apple-use-keychain に変更されているようです(エラーの直接的な原因では無いと思いますが......)。

エラー その2 について

git の設定でアカウント B になっているのではないでしょうか?
リポジトリ配下で git config -l を実行した際に user.name と user.email がアカウント B のものになっていないでしょうか。
その場合はリポジトリ配下で

git config --local user.name <アカウントAのユーザー名>
git config --local user.email <アカウントAのメールアドレス>

を実行すれば解決するかと思います。
なお、コミットログを確認したときに Author がアカウント B のものになっていたらアカウント B としてプッシュされるようですので、この場合は一度コミットを取り消してアカウント A でコミットし直す必要があるようです。
コミットの author のユーザー名とメールアドレス、git config の user.name と user.email は push 時のユーザー認証とは無関係とのこと、uasi さんご指摘ありがとうございました。

1Like

Comments

  1. Apple による拡張とは別に、 -K は FIDO セキュリティキーから鍵をロードするオプションとして標準の ssh-add に追加されていて、それ関係のエラーが出ています。

  2. ご教示ありがとうございます。
    標準の ssh-add の -K については man に書いてありましたね......確認不足で失礼いたしました。

  3. 標準の -K が加わったのは最近のはずなので気づかなくても無理はないと思います。

    それから、コミットの author のユーザー名とメールアドレスは push 時のユーザー認証とは関係ないです。 GitHub 以外で(たとえばローカルネットワークなどで)複数人がコミットしたリポジトリを初めて GitHub に push するときなど、当人以外のコミットがあることもあれば当人のコミットが1つもないこともありますが、それで push するアカウントの判定が変化したりはしません。

    user.nameuser.email の設定も多分認証とは関係しないはずです、アカウントAのコミットとして表示された方が分かりやすいでしょうから設定して損はないと思いますが。

  4. @0913sigma

    Questioner

    dorankoさん、uasiさん、ご回答ありがとうございます。
    質問時に書き忘れてしまいましたが、環境はWindows11です。

    エラーその1について

    ssh-add ~/.ssh/github を実行したところ、以下のエラーが出ました。

    ~/.ssh/github: No such file or directory
    

    ~/.ssh に「github」という名前の空のファイルやフォルダを作ったうえで実行しても結果は変わりませんでした。
    また、ssh-add -lを実行したところ、以下のように表示されました。

    3072 SHA256:/************* アカウントAのメールアドレス (RSA)
    
    エラーその2ついて

    git config -l を実行して、user.name と user.email がアカウントBの物になっていることが判明したので、以下のコマンドを実行しました。ですが、git config -l の user.name と user.email はアカウントBのままでした。

    git config --local user.name アカウントAのユーザー名
    git config --local user.email アカウントAのメールアドレス
    

    (カレントディレクトリはリポジトリ直下です)

    また、git config -l では credential.https://dev.azure.com.usehttppath=true と書かれていました。dev や azure など、ここに出てくる文字列をユーザー名やメールアドレス、フォルダ・リポジトリ名などに使った記憶は全くありません。

    もちろん git commit -u origin main は機能せず、コミットを取り消したうえでもう一度プッシュをしてもアクセス権限がないと言われました。

    さらなる解決方法を教えていただけると幸いです。

  5. @0913sigma

    ssh-keygen は上手くいき、~/.ssh にファイルが生成されたのですが、

    ということでしたが、SSH キーはどのような名前で作成されたのでしょうか?
    ssh-add キー名 で可能なように思えるのですが......。

    user.name, user.email については git config -l --local で変更が確認できれば問題ないかと思います。

  6. ssh-add ~/.ssh/github を実行したところ、以下のエラーが出ました。

    そのファイルが存在しません。 ssh-keygen で作ったという鍵ファイルのパスを渡してさい(あとで言うように、すでにデフォルトの鍵があるのでそれを使ってもよいです)。ここで、作る鍵のファイル名はなんでもよく、 github である必要もありません。空のファイルやフォルダは鍵ファイルではないので追加できません。あると紛らわしいので消した方がいいでしょう。

    元の質問で ssh-add を引数なしで実行したとありますが、その場合はデフォルトで ~/.ssh/id_rsa~/.ssh/id_ed25519 が追加されます。

    ssh-add -lを実行したところ、以下のように表示されました。

    ssh-add を引数なしで実行したときに追加された ~/.ssh/id_rsa の情報が表示されています。なおここで表示されるメールアドレスは、(特に指定しなければ)鍵生成時に鍵ファイルに書き込まれた環境変数 EMAIL の値になっており、 GitHub のアカウントや認証とは特に関係しません。

    GitHub 側にこれと対応する公開鍵 ~/.ssh/id_rsa.pub が登録されていれば、 SSH URL 経由で push したときにこの鍵で認証されます。

    アカウントで鍵を使い分けるつもりがなければ、公開鍵を https://github.com/settings/keys でアカウントAとBの両方に登録してしまってもいいです。

    ですが、git config -l の user.name と user.email はアカウントBのままでした。

    ~/.gitconfig の内容とローカルリポジトリの .git/config の内容が順に表示されるので、アカウントAとした設定も下の方に出てきているはずです。下の値が優先されます。

    また、git config -l では credential.https://dev.azure.com.usehttppath=true と書かれていました。

    Git for Windows に含まれる Git Credential Manager が自動的に書き込む値で、気にしなくていいです。 GitHub の認証に関わるのは(あれば) credential.(略).username の値だけです。

  7. 鍵の話に終始して大本の質問から離れてしまいましたが、元々は鍵でもなんでもいいから push できればいいということでしたね。一旦そこに立ち返ると、エラーが出ているリポジトリの URL

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

    は、 https:// で始まっていることから、ここに push すると SSH 鍵ではなく Git のクレデンシャルヘルパーという仕組みで認証が行われます。アカウントBのほうはそれで認証していたと思われるのですが(git config -lcredential. で始まる値が出るのがそれを示唆しています)、初期設定の仕方が多様なためにアカウントAで動いていない理由を探るのが大変なので、鍵を使う方向に切り替えたほうがいいだろうと判断して回答しています。

    さて、秘密鍵を ssh-add して対応する公開鍵を GitHub に登録できたら、 git push git@github.com:ユーザー名/リポジトリ.git main を実行してみてください。これで一時的に SSH 鍵で認証するモードで push します。

    正常に push できるのを確認したら、 git remote set-url origin git@github.com:ユーザー名/リポジトリ.git で origin の URL を差し替えてください。これで今後の git push origin main が常に SSH 鍵認証を使っての push となります。

Your answer might help someone💌