GitWebAceessを使用したIISによるGitのホスティング

Windowsをメインに扱っていると、GitもWindows Server上でホスティングしたくなります。

イントラ環境ではファイル共有がおそらく一番簡単な解決方法ですが、ホスティングなども含めて考えるとSSHやHTTPでやりたいというのも人情です。SSHはWindowsだとCygwinを使わなくてはならず、何か大変な負けな気がするので、HTTPでやりたいと。

Apacheを使えばGit Proとか読みながら普通にHTTP/HTTPSでGitのリポジトリにHTTP経由でアクセスできるようになりますが、ここはWindowsなのでぜひともIISを使いたいところです。

Git Web Accessとは

Git Web AccessはスマートなGitサーバーIIS上に構築していこうというyysunさんによるプロジェクトで、CoreとなるGitToolsと、ASP.NETのサンプルから構成されていて、以下のCodePlexのサイトからダウンロード可能です。また、Core部分のみをNuGetからインストールすることも可能です。

Git Web Access

github:https://github.com/yysun/Git-Web-Access.git

Gitをホスティングする仕組み

Git Web AccessではGitToolsの中でカスタムのHTTPハンドラクラスを実装しています。それがGitHandlerクラスで、httpのコマンドに合わせてGitのコマンドを発行し、Gitの結果を適切に加工して返しています。つまり、git-http-backend.exeやgit-http-backend.pyが実行している仕事をASP.NETのコードにやらせているわけです。

GitToolsにはそれ以外にもASP.NETからGitを利用するためのユーティリティクラスが用意されています。

準備

まず実行環境として、Git For Windowsの1.7.10以上がインストールされているのが条件です。そのほかにIIS7.5以上、.NET Framework 4.0以上が必要です。

次にGitのレポジトリのルートとなるディレクトリを作成します。今回はD:\reposと作成します。ディレクトリの位置はどのドライブ、名前でもかまいません。作成したフォルダにはIIS_IUSERで変更が可能なようにアクセス権を割り付けます。

WEBサイトの構築

IISのWEBサイトの構築を行います。

そう、WEBサイトです。

Visual Studioを使って作成することも出来ますが、今回はWebMatrix2を使いGitをホスティングするためのWEBサイトを構築します。

WebMatrix2を起動して、ASP.NETの空のページを追加します。

ページの初期設定が終わったら、ファイルを選択します。

NuGetボタンを押してNuGetのユーティリティを起動したら、GitWebAccessをインストールします。

インストールが完了すると、コンポーネントがインストールされ、Web.configが変更されます。

次にWeb.configを以下の要領で変更します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.0">
      <!-- 以下の参照を追加する。 -->
      <assemblies>
        <add assembly="System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Services.Client, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
  </system.web>
  <!-- アドレスが*.gitだったらGitTools.GitHandlerを呼ぶようにhttp handlerを追加する -->
  <system.webServer>
    <handlers>
      <add name="GitHandler" verb="GET,POST" path="*.git" type="GitTools.GitHandler,GitTools"/>
    </handlers>
  </system.webServer>
  <!-- ODataアクセス用 -->
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
  <appSettings>
    <!-- git.exeのインストールパスを設定する。 -->
    <add key="GitExePath" value="C:\Program Files (x86)\Git\bin\git.exe"/>
    <!-- Gitのリポジトリを置くルートディレクトリを設定する。 -->
    <add key="GitBaseFolder" value="D:\repos"/>
    <!--<add key="GitAuthenticationMode" value="Push" />-->
  </appSettings>
</configuration>

5行からは、GitToolsが使用する.NEtFrameworkライブラリへの参照を追加しています。

12行からが、ハンドラの追加で今回のキモです。URLの最後が*.gitとなっていた場合には、GitTools.GitHandlerにHTTPの処理を渡すよう設定しています。

18行目はODataをつかったアクセスのための設定ですが、今回は触れません。

22行目以降が動作設定です。キー:GitExePathはgit.exeへのフルパスを記述します。キー:GitBaseFolderはリポジトリのルートとなるディレクトリをフルパスで指定します。今回はD:\reposを指定しています。また、コメントアウトされていますが、Gitのリポジトリに対するアクセス制限についての設定を記述することが出来ます。また、認証方法自体はIISの設定です。

基本的に上のようにWeb.configを設定しておけば、http経由でGitリポジトリにアクセスするIIS/ASP.NET側の準備は終了です。WEbサイトを実行させておきましょう。

※Web.configはGitHub上のサンプルWebサイトの設定を参考にしました。

共有レポジトリの作成

http経由で共有する共有レポジトリを作成します。

Web.configで指定したレポジトリのルートとなるディレクトリの下に、プロジェクトごとのディレクトリを作成します。このときディレクトリ名は必ず.gitで終わるようにします。今回はWebTest.gitと言うディレクトリ名で作成します。

ディレクトリを作成したら、作成したディレクトリを選択してGit Bashを起動します。

git bashから共有のベアレポジトリを作成します。

> git init --bare --share
> git update-server-info

la -alFなどして、ベアレポジトリが作成されていることを確認します。

Gitからのアクセス

先ほど作ったディレクトリ名がそのままURLのアドレスになる感じですので、以下のようにアクセスできます。

> git clone http://localhost:8001/WebTest.git
> git pull http://localhost:8001/WebTest.git
> git push http://localhost:8001/WebTest.git

サイトのアドレスやポート番号は実際に合わせて変更して下さい。

さいごに

簡単だとも書きませんけど、それほど複雑では無い感じでGitをIISでホストできることがおわかりいただけたのではないかと思います。GitToolの機能は全部見れてませんが、GitHubにあるサンプルのWebサイトや、Webアプリケーション見る限りいろいろと機能豊富そうなので、IssueTrckerとかに組み込むのがいいかもしれませんね。

サンプル全体はgithubで公開しています。
https://github.com/ishisaka/GitWebAccessSample

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください