Makio Tsukamoto tumblelogging in the mood of sinkin' in the rain.
久しぶりにgithubにリポジトリを作成しようとして、githubの出してくれるコマンドリストに沿って作業をしていたところ、「git push -u」で引っかかりました。
C:\Users\tsukamoto\my_package_dir>git push -u origin master
error: unknown switch `u'
バージョンを確認してみたところ、現在ダウンロードリストで見つかる最新版の1.7.6に比べてかなり前の版です。
C:\Users\tsukamoto\my_package_dir>git --version
git version 1.6.5.1.1367.gcd48
1.7.6-preview20110708をインストール、再試行したところ、「git push -u」が実行できました。そうしょっちゅうじゃないけれど、まあこういうこともありますね。
github.comのヘルプ「Setting user name, email and GitHub token - help.github」の和訳です。
このガイドは何らかのコミットをする前にしておいたほうが良い基本的なgitの設定をカバーします。
設定変更はこれ以降のコミットにのみ効果があることには注意してください。これまでにコミットした分は、コミットした時の情報を保持し続けます。また、環境変数GIT_COMMITTER_NAME、GIT_COMMITTER_EMAIL、GIT_AUTHOR_NAME、そしてGIT_AUTHOR_EMAILが定義されていれば、これらはgit-configの設定を上書きします。
グローバルなユーザー名とemailのgit設定
Gitはコミット時に正しいクレジットを行うためにあなたのユーザー名とemailアドレスを知る必要があります。これらの設定を行うことは、GitHubがあなたの行ったコミットのあなたのGitHubアカウントにリンクすることも可能にします。これらの設定を変更して以降のコミットだけがこの新しい情報を使用し、それ以前のコミットはコミット時の情報を保存します。
“email”設定はemailアドレスの妥当性の確認までは行わず、単に“user@server”命名スキーマにマッチすることだけが必要です。
$ git config --global user.name "Tekkub"
$ git config --global user.email "[email protected]"
個々のリポジトリでの上書き設定
もし「責任ある(blamed)」グローバルemail設定でのコミットを望まないのであれば、この設定をリポジトリ単位の基準で上書きすることができます。
$ cd my_other_repo
$ git config user.name "Not Tekkub"
$ git config user.email "[email protected]"
GitHubトークン設定
一部のツールはGitHubにSSHを使わずに接続します。これらのツールにはローカルなGitHub設定をする必要があります。あなたのトークン(token)はアカウントページの先頭で見つけることができます。
$ git config --global github.user tekkub
$ git config --global github.token 0123456789abcdef0123456789abcdef
GitHubのパスワードを変更したときは、新しいトークンが生成されるので、この設定を変更する必要があります。
GitHubでの作業を始める前の作業として
ともうひとつ、このgtiの設定のヘルプをチェックしておくほうがよさそうです。ユーザー名とemailアドレスは「Gitの設定練習」で設定していましたが、GitHubユーザー名とGitHubトークンはまだでした。
github.comのヘルプ「Working with SSH key passphrases - help.github」の和訳です。
このガイドは、キーを使うたびにパスフレーズを再入力することなしに、sshキーを安全に利用する一連の手順に踏み出すためのものです。
なぜパスフレーズが必要なのでしょう?
ご存知の通り、パスワードはそれほど安全とはいえません。もし覚えやすいものを使用していれば、簡単に推測されるか、総当り方式で破られ(brute-force)ます。ランダムなものを使えば覚えるのは困難で、そのために、パスワードを書きとめておきがちです。これはどちらも“Very Bad Things”です。これがsshキーを使うべき理由です。
しかしパスフレーズなしでキーを使うのは、基本的にランダムパスワードをコンピュータ内のファイルに書きとめることと変わりません。あなたのドライブにアクセスすることができた人は誰でも、このキーを使ってあなたが使うあらゆるシステムへのアクセスができるようになってしまいます。これも“Very Bad Things”です。。この解決方法は明らかで、パスフレーズを使うことです。
でもキーを使うたびに長いパスフレーズを入力するなんてしたくありません!
僕だってそうです!ありがたいことに、ssh-agentと呼ばれるかっこいい小さなツールであなたのパスワードを安全に保存することができ、これで再入力をする必要がなくなります。Leopardかそれ以降のOSXであれば、キーをシステムのkeychain二保存して、同様に人生を簡単にすることができます。
パスフレーズの追加または変更
パスフレーズは既存のキーに追加したり、キーペアを再生成することなしに変更することがとても簡単にできます:
$ ssh-keygen -p Enter file in which the key is (/Users/tekkub/.ssh/id_rsa): Key has comment '/Users/tekkub/.ssh/id_rsa' Enter new passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved with the new passphrase.
もしキーがすでにパスフレーズを持っていれば、新しいパスフレーズに変更する前に、これを入力するように促されます。
msysgitでssh-agentを自動起動
以下を~/.profileまたは~/.bashrcに追加することで、ssh-agentを自動的にbashを開いたときに起動させることができます。
SSH_ENV="$HOME/.ssh/environment" function start_agent { echo "Initializing new 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; } # Source SSH settings, if applicable if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null #ps ${SSH_AGENT_PID} doesn't work under cywgin ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi
注意:もしデフォルトのキーめーを使用していないか、キーを異なるパスに保持しているときは、/usr/bin/ssh-add行にそのパスを追加する必要があり、そうすることでsshがキーを探すべき場所を認識します。
これでgit bashを始めて起動したときに、パスフレーズを入力するように促されます:
Initializing new SSH agent... succeeded Enter passphrase for /c/Users/Tekkub/.ssh/id_rsa: Identity added: /c/Users/Tekkub/.ssh/id_rsa (/c/Users/Tekkub/.ssh/id_rsa) Welcome to Git (version 1.6.0.2-preview20080923) Run 'git help git' to display the help index. Run 'git help ' to display help for specific commands. [Tekkub@KAKU: ~ master]$
このプロセスはログアウト、シャットダウン、またはssh-agentをkillするまで実行を続けます。このプロセスをkillするには、そのPIDをpsで調べ、それからkill を呼びます:
[Tekkub@KAKU: ~ master]$ ps PID PPID PGID WINPID TTY UID STIME COMMAND 3796 1 3796 3796 ? 500 18:07:43 /bin/ssh-agent 2780 1 2780 2780 con 500 18:10:50 /bin/bash 3400 2780 3400 784 con 500 18:13:31 /bin/ps [Tekkub@KAKU: ~ master]$ kill 3796
このセクションはこのポストの助けを得てかかれました。
Mac OSX Keychain
もしLeopardまたはそれ以降のOSXを使っていれば、ssh-agentは自動的に実行されています。これはさらにkeychainとの統合もされており、これを使ってキーを解除することができます。これはコマンドラインでのセットアップに比べて、ユニバーサルアクセスやローレベルキーボードルーチンによりあなたの入力がコピーされ、あるいはスパイされることから保護するなどの、いくつかの大きなアドバンテージをもっています。
デフォルトのキーファイル(.ssh/id_rsa、.ssh/id_dsa、そして.ssh/identity)は自動的に処理されます。もし違う名前のキーがあれば、ssh-add path/to/my_keyにより追加することができます。
必ずデフォルトのOS X ssh-add小マンを使い、macportsあるいはその他の外部ソースからインストールされたものを使わないようにしてください。
最初にキーを使用しようとしたときに、パスフレーズを入力するように促されます:
キーチェーンにパスフレーズを保存することを選んだ場合、もう入力する必要はなくなります。代わりに、keychainの解除をするだけです。
このセクションはこのガイドの助けを得てかかれました。もしスリープ後にはロックをするなどのもっと凝りに凝ったキーチェインの設定をしたければ、このガイドをチェックして下さい。
「SSHキーの作り方(Win/msysgit)」の次に行うステップがこれだろうと思います。Windows+msysgit環境では、ssh-agentの自動起動の項だけを意識すればよいと思います。.bashrcの設定を終えたら、「SSHキーの作り方」と同じように、sshで[email protected]にアクセスしてみると良いでしょう。
$ ssh [email protected]
ERROR: Hi tekkub! You've successfully authenticated, but GitHub does not provide shell access
Connection to github.com closed.
このようにパスフレーズを求められことなく、“successfully authenticated”になります。
github.comのヘルプ「Generating SSH keys (Win/msysgit) - help.github」の和訳です。
この文書は、msysgitでキーペアを生成し、GitHubにアップロードするまでに一連のプロセスをあなたに辿るのをガイドします。
msysgitでSSHキーを生成するのは、かなり簡単なプロセスです。まず第一に、cmd(デフォルトWindowsコマンドライン)ではなく、必ずGit Bashコンソールで作業してください。Git Bashはスタートメニューのgitフォルダ内で見つけることもできますし、msysgitのインストール時にコンテキストメニューアイテムのインストールを選択していれば、フォルダを右クリックして“Git Bash Here”を選択することもできます。
既存のキーのバックアップと削除
コンピュータにmsysをインストールするのが初めてではなければ、キーがすでに存在していないか、ダブルチェックをするべきです。もしそれらがあるならば、既存のキーを使うことも、それらを削除することもできます。どちらにせよ、それらのキーのバックアップを作っておくべきです。
$ cd ~/.ssh
$ ls
config id_rsa id_rsa.pub known_hosts
$ cd ..
$ mkdir ssh_key_backup
$ cp .ssh/id_rsa* ssh_key_backup
$ rm .ssh/id_rsa*
この時点で、私たちは既存のキーペア、id_rsaとid_rsa.pubを削除前に~/ssh_key_backupコピーして持っています。デフォルトでは、sshは~/sshにあるid_rsa、id_dsaまたはidentityという名前のキーを使います。
キーの生成
もし既存のキーをもっていてそれを使いたいということであれば、このステップはとばしてかまいません。
sshが既存をキーを使用しないことが確かになったならば、新しいキーペアを生成するタイミングです。RSAキーペアを作りましょう:
$ ssh-keygen -t rsa -C "[email protected]" (※自分のメールアドレスを使用)
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Tekkub/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): (※自分のパスワードを入力)
Enter same passphrase again: (※自分のパスワードを再入力)
Your identification has been saved in /c/Users/Tekkub/.ssh/id_rsa.
Your public key has been saved in /c/Users/Tekkub/.ssh/id_rsa.pub.
The key fingerprint is:
e8:ae:60:8f:38:c2:98:1d:6d:84:60:8c:9e:dd:47:81 [email protected]
最初のプロンプトでは、デフォルトのファイル名でキーを生成するように、単にEnterをたたいてかまいません。キーには、良好なパスフレーズを使うべきです。「Working with SSH key passphrases」で、なぜパスフレーズを使用するべきで、キーを使用するたびに再入力しなくて済むようにするにはどうするのかなどの詳細を参照してください。
GitHubアカウントにキーを追加
ではブラウザを起動しアカウントページを開きましょう。“SSH Public Keys”にある“add another public key”をクリックし、キーを“key”フィールドに貼り付けます。タイトルを空のままにした場合、キーコメント(あなたのemail)がタイトルとして使用されます。
必ず公開鍵(この例ではid_rsa.pub)を使用し、keyフィールド内には空行や空白を付け加えないようにしてください。
きちんと確認
新しいキーがうまく動いているか試すのは簡単です:
$ ssh [email protected]
Hi tekkub! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
“successfully authenticated”メッセージを受け取ることができなかったときは、troubleshooting guideをチェックしてください。
基本的にはこの通りのやり方で、キーペアを生成し、github.comに公開鍵を登録し、認証に成功することを核にできました。最後のステップでパスフレーズの入力を求められたり、“Hi, tekkub!”部分の前にERROR: と表示されたりしましたが、“successfully authenticated”と表示されていればOKだと思います。
Gitで「間違えた」「こうしておけば良かった」と思った時の対処方法を覚えましょう。
準備
作業ディレクトリとしてC:\workディレクトリを使うことにします。
C:>mkdir c:\work
C:>cd c:\work
ここに「readme.txt」「password.txt」の二つのファイルを作っておきます。
C:\work>notepad readme.txt
C:\work>notepad password.txt
readme.txtは次の内容にします。
This is my readme file.
password.txtは次の内容にします。
My password is JugemJugem.
initを取消しましょう。
カレントディレクトリをgitリポジトリにします。
C:\work>git init
Initialized empty Git repository in C:/work/.git/
git情報のためのディレクトリができていることを確認します。dirコマンドに、名前だけを表示するように、/Bオプションを付けます。隠しファイルも表示するように、dirコマンドに/Aオプションを付けます。
C:\work>dir /B /A
.git
password.txt
readme.txt
このディレクトリをgitで管理しないことにします。「.git」ディレクトリを、この内容ごと削除します。
C:\work>rmdir /S .git
.git、よろしいですか (Y/N)? y
gitリポジトリではなくなったことを確認します。
C:\work>git status
fatal: Not a git repository (or any of the parent directories): .git
注意:.gitディレクトリを消すと、すべての履歴情報(過去のバージョン)なども消えます。
Gitのブランチを使いましょう。
ブランチを作成しましょう。
まずブランチを作成してみます。
C:\>git branch lesson-branch
ブランチが作成されたことを確認します。
C:\>git branch
lesson-branch
* master
lesson-branchというブランチが追加されました。現在のブランチ(先頭に * が表示されているもの)は、masterのままです。
ブランチを切り替えましょう。
まずブランチを切り替えます。
C:\>git checkout lesson-branch
ブランチが切り替わったことを確認します。
C:\>git branch
* lesson-branch
master
Gitの設定を行いましょう。
設定を保存しましょう。
まず設定を保存てみます。コミットしたときに作業ログに記録される作者情報として、名前と電子メールアドレスを記録してみましょう。
c:\> git config --global user.name "Tsukamoto"
c:\> git config --global user.email [email protected]
設定を確認しましょう。
先ほど保存したuser.nameの設定を確認してみましょう。
c:\> git config --global user.name
user.name=Tsukamoto
現在保存されているすべての設定を見てみましょう。
c:\> git config --global --list
user.name=Tsukamoto
[email protected]