![함수와 함께 git 하위 모듈 foreach 사용](https://linux55.com/image/45181/%ED%95%A8%EC%88%98%EC%99%80%20%ED%95%A8%EA%BB%98%20git%20%ED%95%98%EC%9C%84%20%EB%AA%A8%EB%93%88%20foreach%20%EC%82%AC%EC%9A%A9.png)
내 목표는 특정 브랜치를 기반으로 모든 git 하위 모듈을 업데이트하는 스크립트를 작성하는 것입니다. 하위 모듈에 해당 분기가 없으면 마스터가 사용됩니다.
이것이 내가 지금 가지고 있는 것입니다:
#!/bin/bash -x
if [ -z $1 ]; then
echo "Branch name required."
exit
fi
function pbranch {
exists=`git show-ref refs/heads/$branch`
if [ -z $exists ]; then
branch="master"
fi
git co $branch
git pull origin $branch
}
branch=$1
git submodule foreach pbranch
하지만 이 스크립트를 실행하면 오류가 발생합니다.
oleq@pc ~/project> git-fetchmodules major
+ '[' -z major ']'
+ branch=major
+ git submodule foreach pbranch
Entering 'submodule'
/usr/lib/git-core/git-submodule: 1: eval: pbranch: not found
Stopping at 'submodule'; script returned non-zero status.
내 추측은 git submodule foreach
eval을 활용하는 것입니다.문서), 이 경우에는 올바르게 사용하지 않습니다.
수십억이 있습니다예"인라인 콜백"과 함께 이 명령을 어떻게 사용할 수 있지만 함수 양식 콜백이 있는 명령을 찾을 수 없습니다. 이 문제를 해결하는 방법을 아시나요?
답변1
함수를 따옴표 안에 콜백으로 넣어 문제를 해결했습니다.
#!/bin/bash
if [ -z $1 ]; then
echo "Branch name required."
exit
fi
git submodule foreach "
branch=$1;
exists=\$(git show-ref refs/heads/\$branch | cut -d ' ' -f1);
if [ -z \$exists ]; then
branch='master';
fi;
echo Checking branch \$branch for submodule \$name.;
git fetch --all -p;
git co \$branch;
git reset --hard origin/\$branch;
"
유사한 변수는 $1
스크립트의 네임스페이스에서 나옵니다. 와 마찬가지로 $\(bar)
"이스케이프된" 항목은 \$branch
"콜백"에서 평가됩니다. 그것은 간단합니다.
답변2
함수를 사용할 수 있지만 먼저 함수를 내보내야 합니다.
export -f pbranch
또한 bash 구문 확장을 원할 경우 bash 셸을 강제로 시작해야 할 수도 있습니다.
git submodule foreach bash -c 'pbranch'
답변3
쉘 함수는 해당 함수가 정의된 쉘 내에만 존재합니다. 마찬가지로 Java 메소드는 해당 메소드가 정의된 프로그램 인스턴스 내에만 존재합니다. 해당 프로그램이 원래 쉘의 하위 프로세스에 의해 실행되는 또 다른 쉘인 경우에도 다른 프로그램에서 쉘 함수를 호출할 수 없습니다.
함수를 정의하는 대신 pbranch
별도의 스크립트를 만듭니다. 당신의 길에 넣으십시오.
#!/bin/sh
branch="$1"
ref="$(git show-ref "refs/heads/$branch")"
if [ -z "$ref" ]; then
branch="master"
fi
git co "$branch"
git pull origin "$branch"
쉘 프로그래밍 참고사항: 따옴표를 생략해야 한다는 것을 알지 않는 한 "$foo"
, 변수 대체 및 명령 대체: 주위에는 항상 큰따옴표를 넣으십시오 . "$(foo)"
보호되지 않은 대체는 공백으로 구분된 전역 패턴 목록으로 해석되며 이는 거의 필요하지 않습니다. 또한 백틱을 사용하지 말고 비슷한 이유로 백틱을 사용하세요 $(…)
. Git 브랜치 이름에는 특수 문자가 포함되어 있지 않고 [ -z $branch ]
공백으로 구문 분석 되기 때문에 여기서는 실제로 중요하지 않습니다 [ -z ]
. branch
하지만 따옴표를 생략하는 습관을 들이지 마세요. 따옴표가 다시 여러분을 괴롭힐 것입니다.
스크립트가 호출된다고 가정하면 pbranch-submodule
다음을 실행할 수 있습니다.
git submodule foreach pbranch-submodule