Git for Windows + TortoiseGit で githubにsshで接続する

タイトルの内容を試してみました。参考になれば幸いです。

ポイント

・TortoisGitのsshクライアントには、デフォルトのsshかTortoiseGit付属のTortoisePlinkを指定することになるが、sshはGit for windows付属のもの他に、Windows10では標準のものなど、複数存在する。
・Git for windows付属のsshはGit bashでは使えているように見えるが、TortoiseGitからの使用は、(私が試した範囲では)その動作が確認できていない。
・Windows10標準のsshをTortoiseGitから使用することは可能だった。(参考: http://www.freia.jp/taka/blog/windows-native-ssh-client/index.html )

・ここでは、TortoiseGit付属のTortoisePlinkを使用する。マシン起動後にPagentを起動して、Pagentに鍵を登録する手間を省きたい場合は上記のWindows10標準のsshの使用をお勧めする。
・githubがputtygenで作成した公開鍵を受け付けてくれなかったので、Git for Windows付属のssh-keygenで公開鍵、秘密鍵を作成し、さらに秘密鍵をputtygenというツールでputty向けのppkファイルに変換する。

手順

1. 公開鍵の作成
・鍵を置くフォルダを作成する。
・作成したフォルダをエクスプローラで開き、右クリックして「Git bash here」をクリックする。Git bashのコンソール画面が開く。
・以下のコマンドを実行して公開鍵を生成する。鍵のファイル名をtest_keyとする。test_keyとtest_key.pubというファイルが作成される。

ssh-keygen -t ecdsa -f test_key

2. putty向けの秘密鍵を作成する。(TortoisGit付属のPuttygenを使用する)。出来上がったファイルをtest_key.ppkとする。

3. githubに公開鍵を登録する。

3. Pagentを起動し、putty向けの秘密鍵を読み込む。

4. TortoiseGitでsshクライアントにTortoisePlinkを使用するように設定する。

5. githubでssh用のリポジトリURLを取得して、クローンする。

powershellを使う

Windows7以降では標準でpowershellが使えます、という話です。

バージョン管理システム(git)のログを整形したいことがありました。
ログの中身は複数のコミットの情報があり、1コミットには複数のファイルのリストが含まれています。これらをファイル毎にコミットの情報を付加して、出力としてはCSVファイルにしたいと思いました。(後はExcelで開いてゴニョゴニョ・・・みたいな。)
でも使用中のWindowsマシンで、LinuxやFreeBSDのような、テキスト処理をする環境もなく、かといってVirutalBoxを入れることもその時は考えていなかったので、powershellを使うことにしました。

結論から言うと、使えたのですが、bashやWindowsのコマンドプロンプトとはいろいろ違うところがあって、例えば、

・スクリプトファイルを書いて実行することができるけど、そのためには予め管理者権限でスクリプトの実行を許可しなければならない。
・パイプ処理ができるけど、受け取るのは文字列のストリームではなくてオブジェクト。パイプ処理に限らず、何かコマンドレット(powershellでいうところのコマンド)を実行すると結果はオブジェクトで帰ってくる。

で、色々やった結果が下記になります。
文字コードの扱いがうまくできなかったので、gitの出力をコマンドプロンプト(cmd)で取得して、テキストエディタ(さくらエディタ)で変換する、ということをして逃げています。

# cmdで以下を実行
#
# git log --numstat --date=iso > ..\log.txt
#
# log.txtのエンコーディングをテキストエディタでUTF8からSJISに変更
#
# powershellで、このスクリプトを実行
#
# .\read_git_log2.ps1 log.txt > log.csv
#
# Excelでlog.csvを開く
# 追加行の集計(シートlogがlog.csvの内容で、A1にファイル名とすると、)
# =SUMIFS(log!E:E,log!$D:$D,"=" & Sheet1!$A1)
# 削除行の集計(シートlogがlog.csvの内容で、A1にファイル名とすると、)
# =SUMIFS(log!F:F,log!$D:$D,"=" & Sheet1!$A1)
$commit = ""
$author = ""
$date = ""
$comment = ""
$file = ""
$chgnum = ""
$chgline = ""
$plusnum = ""
$minusnum = ""
if ($args.Count -eq 0) {
"read_git_log2.ps1 logfile"
return
}
cat $args[0]| % {
$line = $_
if ($line -match '^commit.*$') {
$commit = $line -replace '^commit +', ''
$author = ""
$date = ""
$comment = ""
$file = ""
$plusnum = ""
$minusnum = ""
#$commit
} elseif ($line -match '^Author:.*$') {
$author = $line
$author = $author -replace '^Author: +',''
$author = $author -replace '<.+>',''
$author = $author.ToString().Trim()
#$author
} elseif ($line -match '^Date:.*$') {
$date = $line
$date = $date -replace '^Date: +',''
$date = $date -replace '\+0900', ''
#$date
} elseif ($line -match '^ .+$') {
$txt = $line -replace '\W',' '
$comment = "{0}{1}" -f $comment, $txt
#"comment {0}" -f $comment
} elseif ($line -match '^[0-9-]+\W+[0-9-]+\W+.*$') {
$file = $line -replace '^[0-9-]+\W+[0-9-]+\W+(.*)$','$1'
$plusnum = $line -replace '^([0-9-]+)\W+[0-9-]+\W+.*$','$1'
$minusnum = $line -replace '^[0-9-]+\W+([0-9-]+)\W+(.*)$','$1'
"{0}`t{1}`t{2}`t{3}`t{4}`t{5}`t{6}" -f $commit, $author, $date, $file, $plusnum, $minusnum, $comment
}
}

powershellはクセがあって使いづらいこともありますが、標準で入っていることもあり、使えると便利だと思います。