GITの実行可能ファイルとソースコードの対応の自動化

コンパイルされたプログラミング言語を使用したソフトウェアプロジェクトでは、どのソースコードからビルドされたかを判断する実行可能ファイルがあるという問題が発生します。 この記事では、実行可能ファイルへのコミットの追加を自動化する方法と、それからソースコードを取得する方法について説明します。



一般的に、gitはオブジェクトのリポジトリです。 gitには4種類のオブジェクトがあります。

どのオブジェクトにも、その「オブジェクト名」、つまりこのオブジェクトのデータのSHA1である40個の数字と文字(16進表現)のセットでアクセスできます。 したがって、GITのプロジェクトソースコードの状態は、コミットの「オブジェクト名」または単にコミットによって記述できます。 次のコマンドを使用して、現在のコミットを1行でコメント付きで取得できます。

git log --pretty=oneline -n1
      
      





これで、たとえば--versionパラメーターを指定してプログラムを開始する場合に、実行可能ファイルに追加してユーザーに表示するだけで済みます。



このプロセスは、フック(一部の操作がgitによって実行されるときに実行されるカスタムアクション)を使用して自動化できます。 さまざまなフックがありますが、ポストコミット(git commitの処理後に呼び出される)、チェックアウト(git checkoutの処理後に呼び出される)、およびポストマージ(git mergeの処理後に呼び出され、git pullの間に呼び出される)のみが必要です。 フックは、$ GIT_DIR / hooksディレクトリにある実行可能ファイルです。



フックをgitリポジトリに配置するには、git_hooksフォルダーを作成して$ GIT_DIR / hooksへのシンボリックリンクを作成すると便利です。 このディレクトリに同じ内容のコミット後、チェックアウト後、マージ後のファイルを3つ作成します。 たとえば、C / C ++プロジェクトを使用し、コミットをヘッダーファイルに文字列として保存する場合、これらのファイルは次のようになります。



 #!/bin/sh # post-commit #       file="git_commit.h" file_def=`echo $file|tr . _` echo "#ifndef $file_def" > $file echo "#define $file_def" >> $file echo "static const char *git_commit_str = \""`git log --pretty=oneline -n1`"\";" >> $file echo "#endif" >> $file #        echo "--- Git commit is written to $file ---" echo "--- !!! NOW PLEASE RECOMPILE YOUR PROJECT TO TAKE EFFECT !!! ---"
      
      





これでプロジェクトに、コミットのバージョンを出力する次のコードを挿入できます。

 #include git_commit.h … printf("Git commit: %s\n", git_commit_str);
      
      





git commit、git checkout、git pullが呼び出されるたびに(ローカルバージョンがリモートバージョンと異なる場合)、git_commit.hファイルが上書きされ、必要なコミットを表示するためにプロジェクトをリビルドする必要があります。 将来、実行可能ファイルがあれば、git checkout COMMITを使用してこのファイルのソースコードを取得できます。または、 github.com / USER / PROJECT / tree / COMMITで githubを使用している場合、Webブラウザーでソースコードを表示できます。



ちなみに、SVNでは同じ操作を同様の方法で実行できます。 SVNでは、プロジェクトソースコードの状態はsvnversionコマンドを使用して取得できるグローバルリビジョン番号を使用して記述され、フックはpost-commitおよびpost-revprop-changeイベントでハングできます。



All Articles