aka:Github
- Github Basic Configuration
- Reference
- Memo
- How to reuse existing SSH keys
- Just copy the private and public key into the .ssh directory.
- If you have multiple key paris, write or modify .ssh/config file to bind hosts and keys.
- 複数Github アカウント
- Githubは、1つのGithubアカウントに複数のSSH公開鍵を設定することはできるが、1つのSSH公開鍵を複数のGithubアカウントに設定することはできない。
- 例えば、2つのGithubアカウントを運用する場合は、少なくとも、2つのSSH鍵ベアを用意し、それぞれの公開鍵をGithubアカウントにGithubサイトで登録する。
- 二つの設定事項が発生する。ひとつはSSH鍵に関すること。もうひとつはgitに関すること。
- SSH鍵に関すること
- まず、基本は、ssh-agentが稼動しているかどうかだ。ssh-agentが稼動している場合、Githubに関して複数鍵を運用しようとしても、git@github.comアカウントについて最初に使った鍵が紐付けられてしまうことによって、どちらか一方の鍵しかつかえず、結局どちらか一方のGithubアカウントしか使えない、ということになる。これは結構強力な状況で、sshで-iオプションを使って別の鍵を指定してみたけど無視された。ssh-agentに登録済みの鍵がチェック順序として優先されるのだ。なので別の鍵を使いたい場合は、ssh-add -Dなどで、邪魔になっている鍵の登録を外し、その上で、ssh -i '秘密鍵' などで鍵を紐付けるという手順となる。
- .ssh/configについても注意が必要である。configに複数IdentityFileを記載できるが、あくまでこれは、この順番にチェックしていって繋がればそこでおしまい、というものである。なので、ここにGithub用の複数鍵を列記しても、結局使われるのは一つ目の鍵だけ、という状態になる。なので、.ssh/configにGithub用に複数の鍵を書いておくことは実質的には意味はない。私は、単に記録のためにここに書いておくことにしている。
- gitに関すること
- Githubヘルプに記載あり。
- 簡単にまとめると、ユーザ名、ユーザ電子メールについて、gitではグローバル設定とリポジトリ毎の設定があり、Githubは、このgitのユーザ名をGithubのアカウント名と重ねる仕様となっている。すなわち、複数Githubアカウントを使うということは、このグローバル設定とリポジトリ毎の設定を組み合わせて、それぞれのリポジトリに適切なGithubアカウントを紐付ける。
- SSH鍵に関すること
- この二つからみえることは、例えば、pushするためにGithubにつなぐときに、上記のような設定ではカバーしきれずに、都度利用時にユーザが配慮しなければならないことがあるということだ。すなわち、
- 1. GithubアカウントとSSH公開鍵の紐付けはGithubサイトにてなされている。さらに言うと、その紐付けがなされているのはそこだけ。
- 2. Githubアカウントと、そのアカウントによるリポジトリに対する操作に紐付けられるgitアカウントは、Githubサイト上のProfileページで設定する。(Githubサイト上でできる操作は、リポジトリの作成、フォーク、ブランチ作成、テキストファイルの編集、コミット等が一通りありそうだ。リポジトリ作成以外やったことがない。要調査。)
- 3. 自分の端末からGithubにつなぐときのSSHユーザは、git@github.comである。そのため、手元のSSH鍵はこのUNIXアカウントに結びつけらており、自分が所有しているGithubアカウントには結びつけられていない。GithubアカウントはGithubサーバ上のディレクトリに紐付けられている。例えば、git@github.com:akacs/などとしてアクセスすることからわかる。(https接続についてはどうか。要調査。)
- 4. 手元の環境にて、自分が所有しているGithubアカウントと紐付けされているのは、登録したSSH公開鍵に対応する秘密鍵の存在だけだ。gitのconfigとして、usernameやemailアドレスgitリポジトリに設定できるが、それはとどのつまり、どんな値でも設定可能であるし、Githubアカウントに設定したものと同一である必要はない。(もちろん、同一にしておいた方が便利なこともあろう。それはそういう場合にそうすればいいだけ.)
- 5. 加えて、gitコマンドには、sshコマンドにおける-iのような明示的に鍵を設定するオプションは存在しない。
- このようにGithubアカウントとgitユーザというのは、少なくとも日頃のGithub利用においては、無関係である。日頃、適当なusername, emailで手元のgitリポジトリにコミットしまくって、Githubアカウントを使ったgit protocol (ssh)接続でpushするとき、接続においてGithubアカウントとSSH鍵は使われるが、、、T.B.D.。
というわけで、Github上のリポジトリを操作したりそれにアクセスしたりするときに意味があるのは、(Githubアカウントに紐付けられた)SSH鍵だけであり、gitのconfigは、(ユーザについては)無関係である。そのためGithubにたいしてgit protocolを使う前にssh -T等でgit@github.comと適切な鍵のバインドをssh-agentに登録することが必要になる。例えば次のように。(Created a new reporsitory with the name 'toy-programs' on the Github page) $ mkdir toy-programs $ cd toy-programs $ git init Initialized empty Git repository in /Volumes/ExDrive3/git-repos/local/toy-programs/.git/ $ git config user.email "aka.cs.mail@gmail.com" $ git config user.name "aka" $ touch README $ git add README $ git commit -m 'first commit' [master (root-commit) bc6a24e] first commit 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 README $ git remote add origin git@github.com:akacs/toy-programs.git $ ssh-add -D $ ssh -T git@github.com -i ~/.ssh/ssh-userkey-personel.bastion-XXX-20120128 Identity added: [...]/.ssh/ssh-userkey-personel.bastion-XXX-20120128 ([...]/.ssh/ssh-userkey-personel.bastion-XXX-20120128) Hi akacs! You've successfully authenticated, but GitHub does not provide shell access. $ git push -u origin master Counting objects: 3, done. Writing objects: 100% (3/3), 203 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To git@github.com:akacs/toy-programs.git * [new branch] master -> master Branch master set up to track remote branch master from origin. $
- How to reuse existing SSH keys
- Github Basic Commands
- Reference
- Memo
$ git clone git@github.com:username/Spoon-Knife.git