8

このフィルターを git リポジトリに適用して、チェックアウト時にソリューション ファイルからセクションを削除し、コミット時にこのセクションを追加したいと考えています。

これは、削除または追加したいセクションです。

GlobalSection(SubversionScc) = preSolution
    Svn-Managed = True
    Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection

このフィルターを .git/info/attributes に設定しました

*.sln filter=SourceControlProvider

これらのコマンドを構成に追加しました

$ git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d' %"
$ git config filter.SourceControlProvider.clean "sed -n -e '/^Global$/ r ankhsvnsection ' < %"

まあ、うまくいきません。私は何を間違えましたか?

ankhsvnsection は、*.sln ファイルと同じディレクトリにあるテキスト ファイルです。

4

1 に答える 1

18

ここにいくつかの問題があります。

  1. %両方のフィルターの最後にあります。
    これには特別な意味はなく、追加の引数としてsedに渡されます。おそらくエラーが発生します (ファイル名が sed でない限り%)。
    フィルターは「ストリーミング」する必要があります (標準入力から読み取り、標準出力に書き込みます)。それらの定義には を含めることができますが%f、読み書きするファイルとして実際に扱うべきではありません。Git がその部分を行います。フィルターは stdin から読み取り、stdout に書き込むだけです。

  2. クリーン フィルタは、stdin を からリダイレクトしようとし%fます。
    入力データはすでに stdin にあるため、リダイレクトする必要はありません。

  3. clean フィルターのsedrプログラムは、コマンドを使用して別のファイルにアクセスします。
    フィルターは作業ツリーのルートから実行されているようですが、それが保証されているかどうかはわかりません。

  4. clean フィルターのsedコマンドは-n. その唯一の出力はankhsvnsectionファイルの内容です (入力に行があると仮定しますGlobal)。

  5. sedの一部のバージョン(少なくとも Mac OS X の (古い) BSD バージョン) では、rコマンドのファイル名の後に空白を使用できません (つまりankhsvnsection、クリーン フィルタのsedプログラムの後のスペース)。

フィルターを追加、変更、または削除した後、Git がフィルターを適用する前に、作業ツリー ファイルをタッチ、変更、または削除する必要があります。Git のインデックスは、ワーキング ツリー ファイルの変更時刻を記録します。それらが変更されていない場合、Git は変換git checkout -- filegit add fileれてノーオペレーションになります。

インデックスの実際の内容を確認したい場合 (たとえば、クリーン フィルターが生成したものを確認する場合)、 を使用できますgit show :0:path/from/repo/root/to/filegit diffフィルターも適用されるため、通常は使用できません。

これらは私のために働いた:

git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d'"
git config filter.SourceControlProvider.clean "sed -e '/^Global\$/ r ankhsvnsection'"
于 2011-03-22T10:31:55.893 に答える