※この記事は8/10に書かれたものです。現在では最新のGit2.5のWindows用バイナリも公式に公開されていますので、
 自前ビルドせずともGit2.5が利用できますが、次期バージョンでも同様の手順でビルドできると思われます。

@makki_dです。
普段はLinuxを使っていますが、WindowsでGitをビルドしてみたというお話です。
とても簡単にビルドすることができたので紹介したいと思います。

Git 2.5 を使いたいんです。

先日Git2.5が公開されました。
様々な修正のほか機能も多数追加されましたが、個人的には git worktree コマンドに注目しています。

git worktreeとは

あるブランチで作業をしているときそれを中断して、急ぎで別のブランチの修正をしなければならないことってよくありますよね。
そんな時皆さんはどうしていますか?

  1. 今の作業をとりあえずcommitstashしてブランチを切り替える
  2. もうひとつcloneしてきてそこで作業する
  3. git new-workdirで別ディレクトリに作業ツリーを作る
  4. git worktreeで別ディレクトリに作業ツリーを作る ← New!!

git worktreegit new-workdirと同じく、別ディレクトリに作業ツリーを作ることができるコマンドです。
作業ツリーを別に作ることで、今進めている作業をそのまま置いておきながら、同じリポジトリの別ブランチの作業を別ディレクトリで行うことができます。

具体的な使い方はドキュメントの例がわかりやすいです。

これまでもgit new-workdirがありましたが、このコマンドはシンボリックリンクを作成するため、Windowsの場合一般ユーザ権限では利用できませんでした
一方、git worktreeではシンボリックリンクではなく、ファイル中にパスを記録する形で作業ツリーと親リポジトリの関係が管理されるので、一般ユーザでも利用することができます。

公式のWindows用バイナリは1.9.5 (※8/10時点)

早速 Git 2.5 をWindowsでも使ってみたいところですが、公式のDownloadページには、Windows向けバイナリは1.9.5までしか用意されていません。
そして「新しいバージョンが使いたかったら、ソースからビルドしてね」とさらっと書かれています。

Windows上でOSSのビルド環境を整えるというと多くの場合苦行となるような印象がありますが、Gitの場合は驚くほど簡単に開発環境がセットアップできました。

WindowsでのGitビルド環境

Windows用のバイナリと開発環境は、Git for Windowsで入手できます。
紛らわしいですが、「git for windows」等で検索すると上位に出てくる msysGit は 1.9.5 までしかありません。
特に2系を使いたい場合は、間違えずに後継プロジェクトであるGit for Windowsを見てください。

Git for Windows SDKのダウンロード・インストール

インストーラを実行すると、指定したインストールディレクトリ以下に gcc を始めとした開発ツール・環境・ライブラリ一式がダウンロード・インストールされます。
64bit版SDKのデフォルトのインストールパスは C:\git-sdk-64 なのでそのまま記載しますが、変更した場合は適宜読み替えてください。

インストールパス
ネットワークインストール

インストールが終わるとそのまま Git のビルドが始まりますが、私の環境では gettext 関連のビルドでエラーとなりました。

ビルドエラー

エラーとなったコマンドプロンプトを一旦終了し、msysのシェル (C:\git-sdk-64\mingw64_shell.bat) で改めて開き直します。
gitのソースディレクトリ (/usr/src/git) でmakeを実行すると、先ほどのエラーに引っかからずにビルドできます。

ビルド成功

ビルドできたらmake instalすると C:\git-sdk-64\mingw64\bin に実行ファイル一式がインストールされます。
ここにPATHを通すことで、gitコマンドがコマンドプロンプトやcygwinから使えるようになります。

バージョン2.4.6??

執筆時点のmasterブランチでビルドすると、git のバージョンが2.4.6になっていました。

version

これではgit worktreeが使えない!?と一瞬焦りましたが、よくよくコミットグラフを確認すると、v2.5.0タグのブランチがまるごとmergeされてるため、使いたかったgit worktreeコマンドも使えました。

worktree

ちょっとパッチを当ててみる

git worktreeで作った作業ツリーのサブディレクトリの中でalias登録したgitコマンドを呼び出すと、次のようなエラーが出てしまいます。

makiuchi-d@PC-1034 MINGW64 ~/Projects/test/work1/a (work1)
$ git br
fatal: internal error: work tree has already been set
Current worktree: C:/Users/makiuchi-d/Projects/test/work1
New worktree: C:/Users/makiuchi-d/Projects/test/work1/a

これでは不便なので、エラーを出している部分に即席パッチをあててみようと思います。

diff --git a/environment.c b/environment.c
index fb4eda7..8cf1442 100644
--- a/environment.c
+++ b/environment.c
@@ -226,7 +226,7 @@ void set_git_work_tree(const char *new_work_tree)
 {
        if (git_work_tree_initialized) {
                new_work_tree = real_path(new_work_tree);
-               if (strcmp(new_work_tree, work_tree))
+               if (strncmp(new_work_tree, work_tree, strlen(work_tree)))
                        die("internal error: work tree has already been set\n"
                            "Current worktree: %s\nNew worktree: %s",
                            work_tree, new_work_tree);

※あくまで応急措置です

この修正を加えた上でmakemake installすることで、動くようになりました。

動作確認

まとめ

GitはWindowsでも簡単に開発環境をセットアップできます。
いち早く新機能を試したいときや、ちょっとした修正をしたい場合など、ぜひ試してみてください。

P.S.
8/18、Git 2.5のWndows用バイナリが公式に公開されました。