完全に個人的な備忘録

完全に個人的な備忘録。学習コストが高くなってきたので、メモしておかないと…片っ端から忘却の彼方なのです。

gitのキーワード展開のテスト

基本的には
Git - Git の属性
に記載されている通りなんだけど、自分が理解する意味で同じような事をやってみます。

事前準備としてcleanとsmudgeフィルタを定義する必要があります。ここではGitが使用するフィルタをdaterと定義します。

$Date$ キーワードを展開するスクリプトの例はGitのドキュメントに記載されています。この例はrubyperlで記載されていますが、自分用に、shとsedで記載した場合の例を以降に記載します。オリジナルのドキュメント風に・・・

RCSスタイルの$Date$キーワード展開もまた別の興味深い例です。満足のいく形でこれを行うには、ファイル名を受け取って、プロジェクトの最新のcommitの日付を見付けだし、その日付をファイルに挿入するちょっとしたスクリプトが必要になります。そのようなshスクリプトが以下です。

#! /bin/sh
if [ -t 0 ]
then
    exit 0
fi

last_date=$(git log --pretty=format:"%ad" -1)
sed -e "s/\\\$Date\\\$/\$Date${last_date}\$/g"

このスクリプトは、git logコマンドの出力から最新のcommitの日付を取得し、標準入力からの入力中のすべての$Date$文字列にその日付を追加し、結果を表示します。あなたのお気に入りのどのような言語でスクリプトを書くにしても、簡潔にすべきです。このスクリプトファイルにexpand_date.shと名前をつけ、実行パスのどこかに置きます。次に、Gitが使うフィルタ(daterと呼びましょうか)を設定し、checkout時にexpand_date.shが実行されるようにGitに教えてあげましょう。

開始点に戻るために$Date$文字列内の他の文字列を削除するスクリプトも作成します。

#! /bin/sh
if [ -t 0 ]
then
    exit 0
fi
sed -e "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"

このファイルは contraction_date.sh と名前をつけ、実行パスのどこかに置きます。次に、Gitが使うフィルタ(daterと呼びましょうか)を設定し、checkout時にexpand_date.shが実行されるようにGitに教えてあげましょう。

$ git config filter.dater.smudge expand_date.sh
$ git config filter.dater.clean contraction_date.sh

とりあえず、これで上手く行くんだけど、この方法だと、(ドキュメントにも書いているけど)プロジェクトの最新のCommit日付になります。本当は、ファイルのコミット日付をファイルに挿入する方法にしたいんだけど・・・

その為には、git log を実行する時に path を渡してあげないといけないんだけど、フィルターに path が渡されないと実現できないな・・・

それと、キーワード展開が行なわれるタイミングはcheckout時なので、ファイルに差分が発生してしまうので、いまひとつですね。敢て対応する必要はないかと…