https://www.kernel.org/pub/software/scm/git/docs/ の下のページは、git.gitプロジェクトの Documentation/ ディレクトリから構築されており、最新の状態に保つ必要があります。 www.kernel.org/ サーバー群はミラーリングされており、ミラーの原点はマシン $some.kernel.org にあります。 このマシンで、LinusからGitのメンテナンス職(maintainership)を引き継いだときに私はアカウントを貰いました。

このハウツーに関連するディレクトリは以下の2つです:

/pub/scm/git/git.git/       The public Git repository.
/pub/software/scm/git/docs/ The HTML documentation page.

そこで、私はホームディレクトリの下にドキュメントを生成するためのリポジトリを作成しました。

$ cd
$ mkdir doc-git && cd doc-git
$ git clone /pub/scm/git/git.git/ docgen

必要なことは、 $HOME/doc-git/docgen/ 作業ツリーを更新し、そこでHTMLドキュメントを作成して、結果を /pub/software/scm/git/docs/ ディレクトリにインストールすることです。 そのために私は小さなスクリプトを書きました:

$ cat >dododoc.sh <<\EOF
#!/bin/sh
cd $HOME/doc-git/docgen || exit
unset GIT_DIR
git pull /pub/scm/git/git.git/ master &&
cd Documentation &&
make install-webdoc
EOF

当初、私はパブリックGitリポジトリにプッシュするたびにこれを手動で実行していました。 次に、1日に2回実行されるcronジョブを実行しました。 現在のルーティンでは、以下のような更新後フック(post-update hook)メカニズムを使用しています:

$ cat >/pub/scm/git/git.git/hooks/post-update <<\EOF
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, make this file executable by "chmod +x post-update".
case " $* " in
*' refs/heads/master '*)
        echo $HOME/doc-git/dododoc.sh | at now
        ;;
esac
exec git-update-server-info
EOF
$ chmod +x /pub/scm/git/git.git/hooks/post-update

ここで言及する価値のあるのは以下の4つです:

  • リポジトリが git push を受け入れた後、ユーザー権限でupdate-hookが実行されます。引数として更新されたrefのフルネームが与えられます。 私の post-update は、masterヘッドが更新されたときにのみ dododoc.sh スクリプトを実行します。

  • update-hookを実行すると、 receive-pack を呼び出すことによって GIT_DIRは . に設定されます。 これは、 at コマンドを介して実行される dododoc.sh によって継承され、そして、設定を解除しなければなりません。 そうしないと、 $HOME/doc-git/docgen/ リポジトリへの git pull が正しく機能しません。

  • 更新フックスクリプトのstdoutは git push に接続されていません。 コマンドの大部分を at 内で実行して、実行レポートを電子メールで受信します。

  • これはちょっと大雑把な説明で、同時に行われる呼び出しが互いに干渉するのを防ぐことができません。このためにはいくつかのロックメカニズムを追加する必要があります。