関数で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

関連情報