コミットするたびにファイル内にgitcommitハッシュを含める方法はありますか?アーカイブ中にこれを行う方法を見つけることしかできませんが、すべてのコミットに対してこれを行う方法を見つけることができませんでした。
私はリビジョン管理としてgitを使用して科学的なプログラミングを行っているので、この種の機能は再現性の理由から非常に役立ちます(つまり、すべての結果ファイルと図にgitハッシュが自動的に含まれます)。
コミットするたびにファイル内にgitcommitハッシュを含める方法はありますか?アーカイブ中にこれを行う方法を見つけることしかできませんが、すべてのコミットに対してこれを行う方法を見つけることができませんでした。
私はリビジョン管理としてgitを使用して科学的なプログラミングを行っているので、この種の機能は再現性の理由から非常に役立ちます(つまり、すべての結果ファイルと図にgitハッシュが自動的に含まれます)。
グレッグは彼の答えの中でなぜこれが不可能なのかを説明しました
?<revision-number>
ident
属性
ident
がパスに設定されている場合、gitは$Id$
blobオブジェクトをで置き換え$Id:
、その後に40文字の16進blobオブジェクト名が続き、$
チェックアウト時にドル記号が続きます。ワークツリーファイルで始まり、ワークツリーファイルで終わる
バイトシーケンスは、チェックイン時にに置き換えられます。$Id:
$
$Id$
つまり、通常の回避策は、ある種のビルドプロセスを通じて、バージョン管理されているが別個のファイルに必要な情報を含めることです。
あなたの場合、他のすべてのファイルとそれらのSHA1値のリストを含むファイル。
このようなファイルは、たとえば、コミットごとに生成される可能性があります(実行されたばかりのコミットを修正します)。
別のファイルの例として、Jefromiは、このスクリプトVERSION
によってビルドされたGit自体のファイルを指摘しています。
elif test -d .git -o -f .git &&
VN=$(git describe --match "v[0-9]*" --abbrev=4 HEAD 2>/dev/null) &&
case "$VN" in
*$LF*) (exit 1) ;;
v[0-9]*)
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD --)" ||
VN="$VN-dirty" ;;
esac
then
keyworkとgitattributeを使用すると、ファイルのSHA-1(より正確にはblobのSHA-1、つまりファイルの内容のSHA-1)を簡単に配置できます。$Id$
ident
commitのSHA-1を配置する場合、すぐに使用できるソリューションはありませんが、 gitattributeclean
のsmudge
コマンドを使用できます。コミット後、作成された新しいコミットを反映するように各ファイルを変更する必要があるため、パフォーマンスに悪影響を与えることに注意してください。filter
この質問に対する他の回答で述べたように、たとえばLinuxカーネルやgitプロジェクト自体が行うように、ビルド時に生成されたファイルにバージョン番号を埋め込む方がよいでしょう。
コミットに含まれるファイル内にコミットハッシュを含めると、必然的にハッシュが変更されます。SHA1ハッシュメカニズムを介してリポジトリの整合性を提供するために、Gitはそのような機能をサポートしていません(サポートできません)。
gitハッシュをすべての結果ファイルと図に自動的に含めます。
ハッシュをプログラムへの入力として(たとえば環境変数として)渡すことができます。
ただし、これだけでは、正しいハッシュを渡すことを保証するものではありません。
たぶん、特定のコミットを(ハッシュまたは参照によって)特別な(または一時的な)ディレクトリにチェックアウトし、自動ビルドを実行してから、プログラムを実行し、コミットハッシュをプログラムへの入力として渡すスクリプトを作成できます。
このようにして、正しいハッシュを取得しているという確信が持てるようになります。
しかし、それでも、誰かが偽のハッシュを完全に渡して、誤解を招くような数字を作成する可能性があります。
次のbashスクリプトを使用するだけです(.git / hooks / post-commitに保存します)
#!/bin/bash
# break self-recursiveness
git log | head -n6 | grep -q 'version.h update' && exit 0
commit_id=`git log | head -n3 | grep commit`
v_date=`git log | head -n3 | grep -i date | sed 's|[dD]ate:\s*\(.*\)|\1|'`
sed -i "s|#define COMMIT.*|#define COMMIT \"${commit_id}\"|" server/version.h
sed -i "s|#define V_DATE.*|#define V_DATE \"${v_date}\"|" server/version.h
git commit -m"version.h update" server/version.h
exit 0
参考までに、server / version.hは次のようになり、コミットするたびに更新されます。
#ifndef __version_h__
#define __version_h__
#define COMMIT "commit 2e44e754a9002c99bbf4c09e7827f307d5f0d6f9"
#define V_DATE "Sat Aug 20 19:35:47 2016 +0300"
#endif