git commit以前に与えられたフックベースの回答は、バージョン文字列の同期を;と緊密に結合します。ただし、逆の方法で機能させたいようです。つまり、バージョンは手動で作成されたgit tagメタデータから抽出されます。実際、これはgitソースコード自体が使用するアプローチとほぼ同じであることがわかったので、そのアプローチを調べて、同様の方法を採用する方法を学びましょう。
- 現在のバージョンをインテリジェントに判別しようとするGIT-VERSION-GENシェルスクリプトがあります。基本的に、を介してバージョン文字列を抽出しようとし
git describeますが、それが機能しない場合は、ハードコードされたデフォルトにフォールバックします。バージョンはGIT-VERSION-FILEソースツリーの一番上に書き込まれます。
はこのMakefileスクリプトを呼び出しinclude、生成されたファイルを次のように呼び出します。
GIT-VERSION-FILE: FORCE
@$(SHELL_PATH) ./GIT-VERSION-GEN
-include GIT-VERSION-FILE
Makefileこれで、 viaの残りの部分からバージョンにアクセスできるようになりました$(GIT_VERSION)。
次に、さまざまなMakeルールがこれを使用して、さまざまなPerlスクリプトなど、ハードコードされたバージョン文字列を必要とするファイルの置換を実行します。
$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl GIT-VERSION-FILE
$(QUIET_GEN)$(RM) $@ $@+ && \
INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
sed -e '1{' \
[... snipped other substitutions ...]
-e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \
$@.perl >$@+ && \
chmod +x $@+ && \
mv $@+ $@
たとえば、の先頭近くを見ると、次のように表示されgit-svn.perlます。
$VERSION = '@@GIT_VERSION@@';
私のソースツリーでは、このルールはgit-svn次の行を含むファイルにコンパイルされています。
$VERSION = '1.7.11.rc0.55.gb2478aa';
したがって、ローカルでコンパイルされたバージョンを確認すると、次のようになりgit-svnます。
$ git svn --version
git-svn version 1.7.11.rc0.55.gb2478aa (svn 1.6.17)
一方、rpmベースのインストールを実行すると、次のように表示されます。
$ /usr/bin/git svn --version
git-svn version 1.7.6.5 (svn 1.6.17)
この最後の出力は、サブディレクトリにバージョン管理メタデータが含まれていないリリースされたtarballからソースコードがコンパイルされた場合でも、このアプローチが機能することを示しています.git/。これは、バージョン文字列が安定したリリースと開発スナップショットをうまく区別することを意味します。
Perlスクリプトですがgit-svn、明らかに同じ置換アプローチがシェルスクリプトに対して適切に機能します。