我正在尝试练习使用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
信息
- 关于
xargs
:-n2
最大参数 - https://superuser.com/questions/375690/how-can-i-use-two-parameters-at-once-with-xargs
- https://stackoverflow.com/questions/3770432/xargs-with-multiple-arguments
- 删除所有本地标签:
git tag | xargs git tag -d
- 删除所有偏僻的标签:
git ls-remote --tags origin | sed 's/refs\/tags\///' | sed 's#\^{}##'| cut -f 2 |uniq| xargs git push --delete origin
替代方案git log --oneline --merges --pretty=format:"V%ad_%f %H"
( %f
清理主题)被替换为%s
Perl 清理以接受扩展拉丁字母
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
信息