使用git子模块foreach与功能


10

我的缩进是要有一个脚本,该脚本根据给出的分支来更新所有git子模块。如果子模块没有这样的分支,则使用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 foreach利用了eval(根据文档),在这种情况下我没有正确使用它。

关于如何在“内联回调”中使用此命令的例子有数十亿,但我找不到函数形式的回调中的单个命令。任何想法如何解决这个问题?

Answers:


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 shell:

git submodule foreach bash -c 'pbranch'

5

Shell函数仅存在于定义它的Shell内部。同样,Java方法仅存在于定义该方法的程序实例中,依此类推。您不能从另一个程序调用Shell函数,即使该程序恰好是由原始Shell的子进程运行的另一个Shell。

而不是定义函数,而是制作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"

shell编程注:各地的变量替换和命令替换始终把双引号:"$foo""$(foo)",除非你知道你需要离开报价出来。未保护的替换被解释为用空格分隔的glob模式列表,这几乎是不需要的。另外,请勿使用反引号,出于类似原因,请改用反引号$(…)。在这里,这实际上并不重要,因为git分支名称不包含特殊字符,并且因为[ -z $branch ]解析为空[ -z ]时也是如此branch。但是不要养成忽略引号的习惯,它会回来咬住你。

假设脚本名为pbranch-submodule,然后可以运行

git submodule foreach pbranch-submodule

而且,如果您命名git-pbranch-submodule,它的行为就像内置的git命令:git pbranch-submodulegit submodule foreach git pbranch-submodule。(请注意,foreach接受shell命令而不是git命令。)
idbrii 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.