ここでの最初の問題はthe --msg-filter
is run with no index in placeことです:あなたが実際-inのみ$filter_msg
を持っているので
if test -n "$filter_index" ||
test -n "$filter_tree" ||
test -n "$filter_subdir"
then
need_index=t
else
need_index=
fi
、git filter-branch
常にそれがデフォルト-これによってcat
がにneed_index
セットを離れるということだけだ、1を持っています空の文字列であるため、後でfilter-branch
がコピーするすべてのコミットを繰り返しています(これは上記と同様にgit-filter-branch.sh
から切り捨てられます)。
while read commit parents; do
[snip]
if test -n "$need_index"
then
GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit
fi
[snip]
コミットのツリーがインデックスに読み込まれていないため、git ls-files
(インデックスを読み取る)は何も検索しません。
git ls-files
の代わりにgit ls-tree -r $GIT_COMMIT_ID
を使用するのが最も簡単な方法です。
これが第二の問題に私たちを取得します。
value=$(git ls-files -s | grep -v "folderX" | grep -q .)
私はあなたがここでテストしようとしているのかわからないけど、grep -q
は任意の出力、唯一の出口の状態を作り出すことはありません。したがって、value
は常に空文字列に設定されます。
また、ステージ番号とハッシュ(-s
)を調べる理由はないようです。 -m
オプションがあるにもかかわらず、実際にはここでツリーをマージしていないため、インデックスがある場合はステージ番号は常にゼロになります。あなたは言った:
を... [フラグ]すべてのコミットが私のリポジトリの特定の部分
に影響を与えると「に対する変更を意味し、通常は「修正」を意味し、「影響を与えます」何か "(各コミットはスナップショットなので、何が変更されたかを見るためには他のコミットと比較する必要があります)。
比較対象は、ほとんどの通常の単一親コミットで簡単です。その親と比較するだけです。ルートコミットはそれほど明白ではありませんが、通常は空のツリーと比較したいと考えています(Is git's semi-secret empty tree object reliable, and why is there not a symbolic name for it?参照)。合併については少なくとも明らかです。最初の親、またはすべての親と比較しますか?すべての保護者の場合は、のいずれかがに変更された場合、またはのすべてがに変更された場合のみ、変更されたファイルとみなされますか?
いずれの場合でも、スナップショット内にファイルが存在するかどうかをテストするだけでなく、ここではもっと複雑な作業をしたいことがあります。テストが完了したら、テストが完了したらメッセージフィルタを簡単にすることをお勧めします。
--msg-filter 'some-test-here && echo -n "[flag] "; cat'
ありがとうございます。私は 'git diff-tree --no-commit-id -name-only -r $ GIT_COMMIT'を使用して終了しました。インデックスなしでも動作します。 – Romain
' git diff-tree'はコミットをすべての親と比較し、すべての親と異なる場合、変更されたファイルを考慮します。標準的な2つの親のマージの場合、ファイルFは、(a)両方の親が実際の変更に貢献した場合、(b)コミッターがいわゆる「悪いマージ」を行った場合に変更されます。これは、通常、マージに注意を払うためのかなり良い基準です。したがっておそらく正しいでしょう。 :-) – torek