新しいリポジトリを作成したら、奇妙なエラーが発生しました。 以前 Bitbucket で Git を使用したことがありますが、フォーマットし直したところ、Git が機能しなくなったようです。 コミットした後、グローバルに自分のメール アドレスと名前を追加する必要がありましたが、その後は問題なくコミットされました。
コマンドを使おうとすると
git push origin master
動作しません。次のメッセージが表示されます:
$ git push origin master
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
困惑しています。このリポジトリを共有している友人は問題なくアクセスし、プッシュも問題なく行えましたが、うまく動作しないようです。
ベストアンサー1
これを書いているのは、Windows で Git と BitBucket を使い始めたばかりで、Bash にあまり詳しくない人です (これはよくある問題であり、質問内のエラー メッセージを検索すると Google の結果の上位に表示されるため)。
HTTPSを気にせず、すぐに解決したい人は、この回答の一番下までスクロールして、以下の手順を確認してください。怠け者向け
実際の問題を解決したい場合は、以下の手順に従ってください。
SSHの問題をできるだけ早く修正する
これは、VonC によってリンクされた URL から派生した一連の手順です。可能な限り、弾力性と簡潔性を高めるために変更されました。
$
または で始まらない行は入力しないでください$
($
は、GitBash に入力するものであることを意味します)。GitBashを開く
まだグローバル情報を設定していない場合は、設定してください。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
OpenSSH を確認します。
$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
そういうのを見たことがありますか?
- はい: 続行します。
- いいえ: スキップ怠け者向けセクションを参照するか、VonC のリンクされた記事に従ってください。
キーがすでに生成されているかどうかを確認します。
$ ls -a ~/.ssh/id_*
ファイルが 2 つある場合は、次の手順をスキップできます。
$ ssh-keygen
すべてをデフォルトのままにして、パスフレーズを入力します。次のコマンドで結果が表示されるはずです。
$ ls -a ~/.ssh/id_*
既存の設定ファイルを確認します:
$ ls -a ~/.ssh/config
結果が返された場合は、このファイルに誤った情報がないか確認してください。ファイルが存在しない場合は、次の操作を実行します。
$ echo "Host bitbucket.org" >> ~/.ssh/config
$ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config
内容を確認します:
$ cat ~/.ssh/config
Host bitbucket.org
IdentityFile ~/.ssh/id_rsa
- 「IdentityFile」の前の 1 つのスペースが必要です。
GitBash を実行するたびに SSH エージェントが起動していることを確認します。
$ cat ~/.bashrc
- という関数が表示された場合
start_agent
、この手順はすでに完了しています。 - ファイルがない場合、続行します。
- この関数が含まれていないファイルがある場合、困った状況になります。以下の手順に従って追加してもおそらく安全ですが、そうでない場合もあります。不明な場合は、以下の手順を実行する前に.bashrcのバックアップを作成するか、怠け者向けセクション。
.bashrc ファイルを作成するには、GitBash に以下を入力します。
$ echo "SSH_ENV=$HOME/.ssh/environment" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "# start the ssh-agent" >> ~/.bashrc
$ echo "function start_agent {" >> ~/.bashrc
$ echo " echo \"Initializing new SSH agent...\"" >> ~/.bashrc
$ echo " # spawn ssh-agent" >> ~/.bashrc
$ echo " /usr/bin/ssh-agent | sed 's/^echo/#echo/' > \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " echo succeeded" >> ~/.bashrc
$ echo " chmod 600 \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " /usr/bin/ssh-add" >> ~/.bashrc
$ echo "}" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "if [ -f \"\${SSH_ENV}\" ]; then" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " ps -ef | grep \${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo " }" >> ~/.bashrc
$ echo "else" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo "fi" >> ~/.bashrc
ファイルが正常に作成されたことを確認します (「yourusername」が表示される部分のみ異なるはずです)。
$ cat ~/.bashrc
SSH_ENV=/c/Users/yourusername/.ssh/environment
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
- GitBash を閉じて再度開きます。
- パスフレーズ(先ほど生成した SSH ファイル用)の入力を求められます。
- プロンプトが表示されない場合は、パスフレーズを設定していないか、GitBash が .bashrc スクリプトを実行していません (これは奇妙なことなので、その内容を確認することを検討してください)。これを Mac (OS X) で実行している場合、
.bashrc
デフォルトでは実行されません - 実行され.bash_profile
ます。これを修正するには、次のスニペットを に追加します.bash_profile
。[[ -s ~/.bashrc ]] && source ~/.bashrc
パスフレーズを入力しなかった場合は、GitBash を起動したときに次のような画面が表示されます。
Initializing new SSH agent...
succeeded
Identity added: /c/Users/yourusername/.ssh/id_rsa (/c/Users/yourusername/.ssh/id_rsa)
次のような結果が返されるはずです。
$ ssh-add -l
ただし、以下を受け取った場合はssh-add -l
:
Could not open a connection to your authentication agent.
SSH エージェントが生成されませんでした。.bashrc が原因の可能性があります。
GitBash を起動すると、次のように表示されます。
Initializing new SSH agent...
sh.exe": : No such file or directory
これは、ファイルにエコーするときに $ を \ でエスケープするのを忘れたことを意味します (つまり、変数が展開されました)。これを解決するには、.bashrc を再作成してください。
エージェントが実行されており、キーが追加されていることを確認します。
$ ssh-add -l
次のような結果が返されるはずです:
2048 0f:37:21:af:1b:31:d5:cd:65:58:b2:68:4a:ba:a2:46 /Users/yourusername/.ssh/id_rsa (RSA)
公開鍵を取得するには、次のコマンドを実行します。
$ cat ~/.ssh/id_rsa.pub
(「ssh-rsa ......」で始まる何かが返されるはずです。
- GitBashウィンドウアイコンをクリックします
- 編集をクリック
- マークをクリック
- マウスを使用して公開鍵を強調表示します(先頭
ssh-rsa
ビットと末尾ビットを含む)== [email protected]
- ウィンドウを右クリック(コピーを実行します)
- 公開鍵をメモ帳に貼り付けます。
- 改行をすべて削除して、1 行だけになるようにします。
CTRL+A
次に押すCTRL+C
と、公開キーがクリップボードに再度コピーされます。
次の手順を実行して、BitBucket で秘密鍵を設定します。
- ブラウザを開いて、ビットバケットサイト
- ログインビットバケット
- アバターをクリック(右上)
- アカウントの管理をクリック
- SSHキーをクリックします(左側のメニューのセキュリティの下)
- キーの追加をクリック
Global Public Key
ラベルを入力してください- メモ帳からコピーした公開鍵を貼り付けます
Global Public Key
キーのリストにエントリが表示されるはずです。
- GitBashに戻る
- プロジェクトを含むディレクトリにcdします
- オリジンをSSHバリエーションに変更します(怠け者向けステップ)
リモコンを確認してください:
$ git remote -v
SSH URL に切り替えます:
$ git remote set-url origin [email protected]:youraccount/yourproject.git
正常に動作しているかどうかを確認します。
$ git remote show origin
次のような画面が表示されます。
Warning: Permanently added the RSA host key for IP address '...' to the list of known hosts.
* remote origin
Fetch URL: [email protected]:youruser/yourproject.git
Push URL: [email protected]:youruser/yourproject.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
終わり!
SSH の代わりに HTTPS を使用することもできます。リモート操作中にパスワードを入力する必要があります (一度入力すると一時的にキャッシュされます)。HTTPS を構成する方法は次のとおりです。
怠け者向け
VonCが説明したようにSSHの問題を修正する必要がありますが、コミットを急いでいてツール/時間/知識新しい公開鍵を生成する今すぐ、オリジンを HTTPS の代替として設定します。
> https://[email protected]/accountname/reponame.git
次のようなGUIツールを使用するとトータスGitまたはコマンドラインツール。
オリジンが存在しない場合はオリジンを追加するためのコマンドライン:
git remote add origin https://[email protected]/accountname/reponame.git
既存のオリジンを変更するコマンドライン:
git remote set-url origin https://[email protected]/accountname/reponame.git
注意: アカウント名はメールアドレスではありません。
グローバル情報を設定することもできます:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
その後、再度プッシュを試してください(再度コミットする必要はありません)
git push origin master