스크립트를 작성할 때 git 브랜치를 사용해서는 안됩니다 . Git은 스크립팅에 사용하도록 명시 적으로 설계된 "plumbing"인터페이스 를 제공 합니다 (일반 Git 명령의 많은 현재 및 이전 구현 (추가, 체크 아웃, 병합 등)이 동일한 인터페이스를 사용함).
원하는 배관 명령은 git for-each-ref입니다 .
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
참고 : 참조 이름 검색 경로에서 여러 위치를 일치 remotes/
시키는 다른 참조가없는 경우 원격 참조에 접두사 가 필요하지 않습니다 origin/master
( git-rev-parse의 개정판 지정 섹션 에 있는 "기호 참조 이름.…"참조). (1) ). 명확하게 모호함을 피하려면 전체 참조 이름 : refs/remotes/origin/master
.
다음과 같은 출력이 표시됩니다.
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
이 출력을 sh 로 파이프 할 수 있습니다 .
쉘 코드 생성 아이디어가 마음에 들지 않으면 약간의 견고성을 포기하고 * 다음 과 같이 할 수 있습니다.
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* 참조 이름은 쉘의 단어 분할로부터 안전해야합니다 ( git-check-ref-format (1) 참조 ). 개인적으로 나는 이전 버전 (생성 된 쉘 코드)을 고수 할 것입니다. 나는 그것으로 부적절한 일이 일어나지 않을 것이라고 더 확신합니다.
bash 를 지정 하고 배열을 지원하므로 안전을 유지하면서도 루프의 내장 생성을 피할 수 있습니다.
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
$@
배열을 지원하는 셸을 사용하지 않는 경우 ( set --
초기화 및 set -- "$@" %(refname)
요소 추가) 와 비슷한 작업을 수행 할 수 있습니다.