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]なので、デフォルトの行区切りで使用できます

答え2

  • パイプラインと以下を使用してマージするたびにgitタグを作成しましたxargs
    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" |xargs -n2 git tag --force

または

  • パイプラインとのマージごとにgitタグを作成し、次のawk場所にgitタグを生成しましたxargs

    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" | awk '{system("git tag --force " $1 " " $2)}'

または

  • xargsとbashの使用

    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" | xargs -l bash -c 'git tag $0 $1 --force'

または

  • タグ名にはトピックの「その他」が含まれています。
    • git log --oneline --merges --pretty=format:"V%ad_%f %H" --date=format:"%Y%m%d_%H_%M" | sed "s/\./_/g" | xargs -l bash -c 'var="$0" && git tag --force ${var:0:100} $1'

後:git push --tags origin mytargetbranch

情報

拡張ラテン文字を許可するために、代替git log --oneline --merges --pretty=format:"V%ad_%f %H"%fクリーンテーマ)がPerlクリーンに置き換えられました。%s

git log --oneline --merges --pretty=format:"V%ad_%s+++%H" --date=format:"%Y%m%d_%H_%M"| perl -pe 's/[\?\[\]\/\\=<>:;,\x27"&\$#*()|~`!{}%]//g;' |   sed "s/[ .]/_/g" |   sed "s/+++/ /g"  |   sed "s/+//g" | xargs  -l bash -c 'var="$0";git tag --force  ${var:0:100} $1' && git push --tags origin mytargetbranch

情報

関連情報