2017-02-11 24 views
0

私のリポジトリの特定の部分に影響を及ぼすすべてのコミットに対してadd to keywordを試しています。私はこのような何かを試した:git filter-branch条件付きmsg-filter

git filter-branch --msg-filter \ 
'value=$(git ls-files -s | grep -v "folderX" | grep -q .) \ 
([[ $value -eq 1 ]] && echo "[flag]" && cat) || cat' HEAD 

しかし、それは動作しません。 git ls-files -sは空を返します。私は、フィルタブランチ操作中にリポジトリの状態が何であるか、そしてフィルタの中でgitコマンドから何を期待するべきかを理解していません。

誰かがこれを達成する方法を知っていますか?

答えて

0

ここでの最初の問題は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' 
+0

ありがとうございます。私は 'git diff-tree --no-commit-id -name-only -r $ GIT_COMMIT'を使用して終了しました。インデックスなしでも動作します。 – Romain

+0

' git diff-tree'はコミットをすべての親と比較し、すべての親と異なる場合、変更されたファイルを考慮します。標準的な2つの親のマージの場合、ファイルFは、(a)両方の親が実際の変更に貢献した場合、(b)コミッターがいわゆる「悪いマージ」を行った場合に変更されます。これは、通常、マージに注意を払うためのかなり良い基準です。したがっておそらく正しいでしょう。 :-) – torek

-1

プロセスのデバッグを試みます。このようなものを使用します。

echo $value >&2 

>&2は、ストリームをエラーにリダイレクトすると、コンソールに表示されます。