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
、明らかに同じ置換アプローチがシェルスクリプトに対して適切に機能します。