gitでxargsを使う

gitでxargsを使う

を使って練習しようとしていますxargs。 SHA1を介して渡し、以下を試しましたxargs

$ git show SHA1 --name-only

私も次のことを試しました。

$ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs {} git show {} --name-only

帰ってきたxargs: {}: No such file or directory

だから私は続けます:

$ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs -0 -I {} git show {} --name-only

返品:

fatal: ambiguous argument 'a1237ac27321f2daea365787664e4119b339c483': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

言及されたSHAは正確ですが、これがうまくいかない理由も理解していません。

ベストアンサー1

xargs -0引用するヌルバイトのみを使用入力レコードを分離し、入力に改行やその他のスペースを含めます。リビジョン出力の末尾に改行があり、そこに出て与えられた引数headcut含まれますgit。 Gitはこの記事を嫌います。エラーメッセージで改行を編集したようですが、実際にはここにあるメッセージの一部であり、問​​題の原因です。

削除すると、-0あなたのコマンドは私に効果的です。生成された入力を考慮すると、改行で区切られたデフォルトの動作はxargs安全です。

この場合でも、実際にそれを使用する必要はありません-I {}git最後の引数としてリビジョンを持つことをお勧めしますが、練習用にのみ使用しているようです。デフォルトでは、引数xargsだけが指定されたコマンドの最後に配置されます(代替find -exec使用とは異なり{})。


ただし、Gitをそれ以上使用するcut必要がありますxargs--pretty=tformat...オプション1行に1つずつSHA1ハッシュのみを出力することができます。

git log --author=jim --grep="patch" --pretty=tformat:'%H'

コミットに一致するリポジトリのすべてのハッシュを1行に1つずつ出力します。--pretty出力形式を設定します。tformat各ハッシュの末尾に改行文字を配置することを意味します。 '%H'はハッシュ値を表します。

これをxargsにパイプすることができ、入力全体が「clean」[a-f0-9]なので、デフォルトの行区切りで使用できます

おすすめ記事