将 xargs 与 git 一起使用

将 xargs 与 git 一起使用

我正在尝试练习使用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仅使用空字节分隔输入记录,并在输入中包含换行符和其他空格。您将在修订输出的末尾有一个换行符,它将head离开cut那里,并且将包含在给定的参数中git。 Git 不喜欢这样。我认为您已经从错误消息中编辑了换行符,但它实际上是此处消息的一部分以及导致您的问题的原因。

删除-0使你的命令对我有用。给定您生成的输入,默认的换行符分隔行为xargs是安全的。

在这种情况下,您实际上也不需要使用-I {}-git很高兴将修订版作为最后一个参数,但我猜您是为了练习而使用它。默认情况下,xargs仅将参数放在给定命令的最末尾(与find -exec使用{}替换的 不同)。


不过,您还需要对您的cut. Git 不仅能够以可与xargs.使用选项--pretty=tformat...我们可以让它只输出 SHA1 哈希值,每行一个:

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

将输出存储库中匹配提交的所有哈希值,每行一个。--pretty设置输出格式;tformat意味着在每个散列的末尾放置一个换行符; '%H' 表示哈希值。

您可以将其通过管道传输到 xargs 中,并且由于整个输入是“干净的”[a-f0-9],因此您可以将其与默认的行分隔一起使用

答案2

  • 我为每次与 pipeline 和 with 的合并创建了 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清理主题)被替换为%sPerl 清理以接受扩展拉丁字母

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

信息

相关内容