2

古い SVN リポジトリから Git コミットを見つけるための bash コマンドをまとめています。これが私のコマンド全体です:

$ svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//' | xargs --verbose -i% git log --pretty=oneline --grep=\"%\"
git log --pretty=oneline --grep="Always restore PG(magic_quote_gpc) on request shutdown"

コマンドの最初のいくつかの部分を実行すると、コミット コメントが表示されます。

$ svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//'
Always restore PG(magic_quote_gpc) on request shutdown

これで問題なく動作しますが、xargs 経由で git log --grep を使用したい場合、動作しません (応答がありません)。

ここに奇妙な部分があります...--verboseコマンドを出力します。その正確なコマンドをコピーして貼り付けると、必要な出力が得られます。あれは:

$ git log --pretty=oneline --grep="Always restore PG(magic_quote_gpc) on request shutdown"
87c038be06b8b0eb721270f98c858fd701f5d54b Always restore PG(magic_quote_gpc) on request shutdown

また、これは何らかの理由で機能しません。

$ echo -n "Always restore PG(magic_quote_gpc) on request shutdown" | xargs --verbose -i% git log --grep=\"%\"
git log --grep="Always restore PG(magic_quote_gpc) on request shutdown"

だから、それは私の xargs の使用法に違いありませんよね?

4

2 に答える 2

2

xargs を介して実行しているコマンドを sh にラップします

git rev-parse HEAD | xargs -n 1 -i{} sh -e "git log -1 {}"

これを使用して、いくつかのエスケープの問題を解決し、xargs が渡す各項目に対して複雑なスクリプトを実行しました。

git rev-parse HEAD | xargs -n 1 -i{} sh -e "some crazy looped code with {} embedded in multple places"
于 2012-08-10T23:39:11.790 に答える
0

問題は、引用符をエスケープしていることです。なぜこれが問題なのかはわかりませんが、試してみましたが、問題は間違いなくエスケープされた引用符にあります。どういうわけか、 xargs がコマンドを呼び出すと、これらの引用符が引数の一部になるためAlways restore PG(magic_quote_gpc) on request shutdown、 を検索する代わりに を検索しています"Always restore PG(magic_quote_gpc) on request shutdown"。以下はあなたのために働くはずです:

svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//' | xargs --verbose -i% git log --pretty=oneline --grep="%"
于 2012-08-10T19:23:28.737 に答える