을 사용하여 연습하려고 합니다 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
사용 과 달리 {}
).
그러나 Git을 그 이상으로 사용할 cut
수도 있어야 합니다 xargs
.--pretty=tformat...
옵션한 줄에 하나씩 SHA1 해시만 출력하도록 할 수 있습니다.
git log --author=jim --grep="patch" --pretty=tformat:'%H'
커밋과 일치하는 저장소의 모든 해시를 한 줄에 하나씩 출력합니다. --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
정보
- 정보
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
Clean 테마)이 Perl Clean으로 대체되었습니다.%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
정보