一般的に、gitはオブジェクトのリポジトリです。 gitには4種類のオブジェクトがあります。
- blob-データを保存します。
- tree -blobや他のツリーへのリンクを保存します。
- commit-特定のツリーオブジェクトを指す、つまり 特定の時点でプロジェクトのスナップショットをマークします。
- tag-コミットをプロジェクトの何らかのバージョンとしてマークします。
どのオブジェクトにも、その「オブジェクト名」、つまりこのオブジェクトのデータの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イベントでハングできます。