함수와 함께 git 하위 모듈 foreach 사용

함수와 함께 git 하위 모듈 foreach 사용

내 목표는 특정 브랜치를 기반으로 모든 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 foreacheval을 활용하는 것입니다.문서), 이 경우에는 올바르게 사용하지 않습니다.

수십억이 있습니다"인라인 콜백"과 함께 이 명령을 어떻게 사용할 수 있지만 함수 양식 콜백이 있는 명령을 찾을 수 없습니다. 이 문제를 해결하는 방법을 아시나요?

답변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

관련 정보