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인용하다널 바이트만 사용입력 레코드를 분리하고 입력에 줄 바꿈 및 기타 공백을 포함합니다. 개정판 출력 끝에 줄 바꿈이 있고, 거기로 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

정보

확장된 라틴 문자를 허용하기 위해 대안 git log --oneline --merges --pretty=format:"V%ad_%f %H" ( %fClean 테마)이 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

정보

관련 정보