5

コミットするたびにファイル内にgitcommitハッシュを含める方法はありますか?アーカイブ中にこれを行う方法を見つけることしかできませんが、すべてのコミットに対してこれを行う方法を見つけることができませんでした。

私はリビジョン管理としてgitを使用して科学的なプログラミングを行っているので、この種の機能は再現性の理由から非常に役立ちます(つまり、すべての結果ファイルと図にgitハッシュが自動的に含まれます)。

4

5 に答える 5

2

グレッグ彼の答えの中でなぜこれが不可能なのかを説明しました

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
于 2010-05-18T04:04:38.733 に答える
2

keyworkとgitattributeを使用すると、ファイルのSHA-1(より正確にはblobのSHA-1、つまりファイルの内容のSHA-1)を簡単に配置できます。$Id$ident

commitのSHA-1を配置する場合、すぐに使用できるソリューションはありませんが、 gitattributecleansmudgeコマンドを使用できます。コミット後、作成された新しいコミットを反映するように各ファイルを変更する必要があるため、パフォーマンスに悪影響を与えることに注意してください。filter


この質問に対する他の回答で述べたように、たとえばLinuxカーネルやgitプロジェクト自体が行うように、ビルド時に生成されたファイルにバージョン番号を埋め込む方がよいでしょう。

于 2010-05-18T12:57:46.873 に答える
1

コミットに含まれるファイルにコミットハッシュを含めると、必然的にハッシュが変更されます。SHA1ハッシュメカニズムを介してリポジトリの整合性を提供するために、Gitはそのような機能をサポートしていません(サポートできません)。

于 2010-05-17T22:06:18.653 に答える
0

gitハッシュをすべての結果ファイルと図に自動的に含めます。

ハッシュをプログラムへの入力として(たとえば環境変数として)渡すことができます。

ただし、これだけでは、正しいハッシュを渡すことを保証するものではありません。

たぶん、特定のコミットを(ハッシュまたは参照によって)特別な(または一時的な)ディレクトリにチェックアウトし、自動ビルドを実行してから、プログラムを実行し、コミットハッシュをプログラムへの入力として渡すスクリプトを作成できます。

このようにして、正しいハッシュを取得しているという確信が持てるようになります。

しかし、それでも、誰かが偽のハッシュを完全に渡して、誤解を招くような数字を作成する可能性があります。

于 2010-05-18T00:03:44.940 に答える
0

次の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
于 2016-08-20T16:38:26.093 に答える