함수마다 git 서브 모듈 사용


10

필자는 주어진 브랜치에 따라 모든 자식 서브 모듈을 업데이트하는 스크립트를 작성하는 것입니다. 하위 모듈에 대해 그러한 분기가 없으면 master가 사용됩니다.

이것이 내가 지금 가진 것입니다.

#!/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 ( documentation 에 따르면)을 사용하는데,이 맥락에서 올바르게 사용하지 않습니다.

이 명령을 "인라인 콜백"과 함께 사용하는 방법에 대한 수십억 개의 예가 있지만 함수 형태의 콜백이있는 단일 명령을 찾을 수 없습니다. 어떻게 해결할 수 있습니까?

답변:


7

따옴표 안에 함수를 콜백으로 넣어서 문제를 해결했습니다.

#!/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"콜백"내에서 평가됩니다. 꽤 쉬웠다.


7

함수를 사용할 수 있지만 먼저 내 보내야합니다.

export -f pbranch

또한 bash 구문 확장을 원할 경우 bash 쉘을 강제로 시작할 수 있습니다.

git submodule foreach bash -c 'pbranch'

5

쉘 함수는 정의 된 쉘 내부에만 존재합니다. 마찬가지로 Java 메소드는 정의 된 프로그램 인스턴스에만 존재합니다. 해당 프로그램이 원래 쉘의 하위 프로세스에 의해 실행되는 다른 쉘인 경우에도 다른 프로그램에서 쉘 함수를 호출 할 수 없습니다.

함수를 정의하는 대신 pbranch별도의 스크립트를 만드십시오 . 당신의 PATH에 넣으십시오.

#!/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

그리고 이름을 지정하면 git-pbranch-submodule내장 git 명령처럼 동작 할 수 있습니다 : git pbranch-submodule또는 git submodule foreach git pbranch-submodule. (foreach는 git 명령이 아닌 쉘 명령을 받아들입니다.)
idbrii
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.