[解決済み] C言語で書いたコードが自動的にGitのバージョンハッシュを出力するには?
2023-03-30 05:20:16
質問
Git のバージョン・ハッシュにアクセスする C 言語コードを書く簡単な方法はありますか?
私は実験室で科学的なデータを収集するためにC言語でソフトウェアを書きました。私のコードは、後で分析するために、収集したデータを .yaml ファイルに記録しています。私の実験は日々変化しており、しばしばコードを修正する必要があります。リビジョンを追跡するために、私は git リポジトリを使用しています。
私は、.yaml データファイルにコメントとして Git リビジョンハッシュを含めることができればと思っています。そうすれば、.yaml ファイルを見て、そのファイルに示されているデータを生成するためにどのコードが使用されたかを正確に知ることができます。これを自動的に行う簡単な方法はありますか?
どのように解決するのですか?
私のプログラムでは、git のバージョン番号とビルドの日付を別のファイルに保持しており、そのファイル名は
version.c
という別のファイルに格納しています。
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
また、ヘッダーファイルもあり、以下のような感じです。
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
ヘッダファイル、Cファイルともに、以下のようなPerlスクリプトで生成されます。
my $git_sha = `git rev-parse HEAD`;
$git_sha =~ s/\s+//g;
# This contains all the build variables.
my %build;
$build{date} = make_date_time ();
$build{git_sha} = $git_sha;
hash_to_c_file ("version.c", \%build, "build_");
ここで
hash_to_c_file
を作成するためのすべての作業を行います。
version.c
と
version.h
そして
make_date_time
は、図のような文字列を作ります。
メインプログラムの中で、ルーチン
#include "version.h"
// The name of this program.
const char * program_name = "magikruiser";
// The version of this program.
const char * version = "0.010";
/* Print an ID stamp for the program. */
static void _program_id_stamp (FILE * output)
{
fprintf (output, "%s / %s / %s / %s\n",
program_name, version,
build_date, build_git_sha);
}
gitについてはそれほど詳しくないので、もっと良い方法があればコメントをお待ちしています。
関連
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git で現在のブランチ名を取得するには?
-
[解決済み] Git で現在のコミットのハッシュを取得する方法は?
-
[解決済み] マージされたGitブランチをすべて削除するにはどうすればよいですか?
-
[解決済み] Git のコミットで変更点を確認するには?
-
[解決済み] Git のブランチの一覧を最新のコミット順に表示するにはどうしたらよいですか?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C/C++の再定義
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?