일련의 git 체크아웃을 반복하고 각 디렉토리에서 git 명령을 실행하는 스크립트가 있습니다.
이제 명령줄에서 셸 스크립트에 인수를 전달하고 해당 인수를 실행 중인 git 명령에 통합할 수 있기를 원합니다.
저는 다음 스크립트를 테스트로 사용하고 있습니다(표시되는 매개변수를 볼 수 있을 때까지 git 명령을 제거했습니다).
#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` $1; echo ""'
인수가 포함된 명령을 실행하면 .git 디렉터리와 인수가 포함된 디렉터리의 이름이 표시될 것으로 예상됩니다.
디렉터리 이름만 가져옵니다.
많은 노력 끝에 이걸로 끝이었는데..
#!/usr/bin/env bash
find . -type d -exec test -e '{}/.git' ';' -print -prune | BRANCH="$1" xargs -P 1 -I {} sh -c 'cd {}; echo `pwd` "${BRANCH}"; echo ""'
제가 누락된 정비사가 있나요? 주장을 전달하는 "더 나은" 방법이 있습니까?
답변1
쉘 스크립트 내에서 인라인 스크립트를 사용하여 다른 쉘을 호출할 수 있습니다. 이 스크립트를 작은따옴표로 묶어서 $1
그대로 전달됩니다. 방금 시작한 새 셸에는 자체 매개변수 집합이 있지만 비어 있습니다. 따라서 구문 분석할 때 $1
null로 확장됩니다 .
작업 예제에서는 새 셸에 표시되는 새 변수에 값을 할당합니다.
모든 git 저장소를 찾으려면 all-git
아래 스크립트를 복사할 수도 있습니다. 사용법은 간단합니다. all-git <git command>
예를 들어all-git status -bs
#!/bin/bash
for repo in `find $PWD -type d -name .git`
do
repo=${repo%.git}
(
cd $repo
echo "${repo%/}: " | sed -e "s#$HOME#~#"
git "$@"
)
done
답변2
find . -type d -exec test -e '{}/.git' ';' -print -prune | \
xargs -P $(nproc) -I {} sh -c "cd \"{}\"; echo \"\$(pwd) $1\"; echo "
작동해야 하지만 내보낸 함수를 호출할 수도 있습니다.
OPT="$1"
function doGitWork {
DIR="$1"
cd "$DIR"
echo "$(pwd) $OPT"
}
export -f doGitWork
find . -type d -exec test -e '{}/.git' ';' -print -prune | \
xargs -P $(nproc) -I {} sh -c "doGitWork \"{}\";"
답변3
GNU Parallel을 사용하면 다음과 같습니다:
find . -type d -exec test -e '{}/.git' ';' -print -prune |
parallel 'cd {}; echo $(pwd) {}; echo'
git pull
디렉토리가 있는 모든 디렉토리에서 다음을 수행 하려면 다음을 수행하십시오 .git
.
allgit() {
find . -type d -name .git |
parallel --tagstring {//} "cd {//}; git $@"
}
allgit pull