Browse Tag: github

GPG キーの移動方法

少し前に GitHub で GPG 署名がサポートされたため、さっそく使っているのですが、他のマシンに GPG キーを移動する方法を調べてみました。

OS X の場合は、brew install gpp2 して、gpg2 コマンドを使ったほうがよいわけですが、次のようになります。

移行元のマシンで実行

$ email=< メールアドレス >
$ name=< ファイル名 >
$ gpg2 -a --export $email > $name-public-gpg.key
$ gpg2 -a --export-secret-keys $email > $name-secret-gpg.key
$ gpg2 --export-ownertrust > $name-ownertrust-gpg.txt

移行先のマシンで実行

$ email=< メールアドレス >
$ name=< ファイル名 >
$ gpg2 --import $name-secret-gpg.key
$ gpg2 --import-ownertrust $name-ownertrust-gpg.txt
$ gpg2 --list-keys
...

こんな感じであっさりとできました。

あと、都度リポジトリで GPG の設定をするのはめんどくさいので、次のようなシェルスクリプトを書いて使っています。


#!/bin/sh

email=$1
if [ -z "$email" ]; then
email=$(git config user.email)
fi

gpg=gpg
if [ $(which gpg2) ]; then
gpg=gpg2
fi

gpg_pub_key=$($gpg --list-keys | grep -1 "< $email>"| grep -e "^pub")
gpg_pub_key_id=$(echo $gpg_pub_key | cut -d ' ' -f 2 | cut -d '/' -f 2)
if [ -z "$gpg_pub_key_id" ]; then
echo "Could not get gpg pub key - $gpg_pub_key_id"
exit 1
fi

git config --local gpg.program $gpg
git config --local user.signingkey $ggp_pub_key_id
git config --local commit.gpgsign true

このスクリプトでメールアドレスを省略された場合は、リポジトリ設定のメールアドレスを利用しているのでけっこう便利です。

コミット履歴に「Verified」と標示されるのは、少しかっこいいですよね!

github で複数のアカウントを切り替えるときにはまった話

みんな大好き github で、複数のアカウントを切り替えたくてはまったお話。

メインアカウントの SSH 鍵を ~/.ssh/id_rsa でずっと使っていました。
そのあと、ある github.com 上にあるプライベートリポジトリに別のアカウントで切り替える必要がでてきました。
そこで、~/.ssh/config に、次のような設定を追加しました。

もちろん、事前に切り替える専用の SSH 鍵を作成しました。

$ ssh-keygen -t rsa -C "mail address" -f ~/.ssh/github/id_rsa


Host gh-hoge-naoya
HostName github.com
User git
IdentityFile ~/.ssh/github/id_rsa

この状態で ssh 経由でプライベートリポジトリを clone しようとしたわけですが、”Repository not found” となってしまいました。https 経由だと clone することができます。
状況とすると、上の hoge-naoya というユーザで github.com 上に登録されており、そのアカウントはプライベートリポジトリをもっています。

そこで gihtub.com にあるヘルプを参考にして、アカウント名を確認してみました。


$ ssh -T git@gh-hoge-naoya
Hi naoya! You've successfully authenticated, but GitHub does not provide shell access.

おや、アカウント名がおかしいです。naoya というアカウント名はプライベートリポジトリをもっていないアカウントです。.ssh/config にはちゃんと設定されています。次の詳細情報を表示してみました。

$ ssh -vT git@gh-hoge-naoya
...

詳細情報をみてみると、なんということでしょう。~/.ssh/id_rsa が送られているようです・・・。~/.ssh/id_rsa は、naoya というアカウント名に登録されていたので、この状態だとうまく切り替えることができないようです。

そこで、naoya というアカウント名も github 専用の SSH 鍵を作成して、.ssh/config に次のように追加しました。

Host gh
HostName github.com
User git
IdentityFile ~/.ssh/github/id_rsa

この状態で、確認してみると、バッチリ切り替わっていました。

$ ssh -T git@gh-hoge-naoya
Hi hoge-naoya! You've successfully authenticated, but GitHub does not provide shell access.
$ ssh -T git@gh
Hi naoya! You've successfully authenticated, but GitHub does not provide shell access.

あとは、プライベートリポジトリを clone したあと、正しく名前とメールアドレスの変更を忘れないようにしたいですね。

$ git config user.name "Naoya Nakazawa"
$ git config user.email "naoya@example.jp"

あわせて、既存のリポジトリ名は、origin url を変更するのも忘れないようにしましょう。直接、.git/config を編集してもいいかと思います。

$ git remote set-url origin git@gh:naoya/test.git

hub が便利

hub という github のラッパーコマンドが便利です。man は、こちら。インストールは、gem install hub するだけ。
あとは、git コマンドを hub にエイリアスすると、さらに便利かもしれません。

github にリポジトリを新規作成する

$ mkdir hoge
$ cd hoge
$ git init
$ hub create
$ git add README
$ hub push -u origin master
(以降は・・・)
$ hub push

man をみると、github 向けに拡張されたコマンドがあるので、とても便利です。

ということで、hub コマンドがない環境も考慮して、次の設定を .zshrc に、追加してみました。

if [ -x "`which hub 2> /dev/null`" ]; then
alias git=hub
else
alias git=git
fi

alias g=git

Enjoy, github life.

github Tips #1

github.com で、fork したブランチに fork 元の変更をマージする方法を調べてみました。

例として、「git://github.com/nakazawa/github-services.git」fork 元の HEAD、「git://github.com/naoya/github-services.git」を fork 先とします。

fork したブランチをもってきます。

$ git clone git://github.com/naoya/github-services.git

fork 元のリモートリポジトリを upstream として定義します。

$ cd github-services

$ git remote add upstream git://github.com/nakazawa/github-services.git

$ git fetch upsteam

あとは、さきほど定義したリモートリポジトリからオブジェクトをダウンロードして、マージします。

$ git fetch upstream

$ git merge upstream/master

たったこれだけで fork 元の変更をマージすることができます。

また、fork 元の HEAD が更新されたから、fetch と merge を実行すればいいはずです。

この情報源は、github のヘルプページでした。github を使いこなすには、github のヘルプページを一通り見たほうがいいかもしれませんね。help.github は、今のところ英語版だけなので、日本語版を作成するもありかなと思いました。