Використовуйте функцію git submodule 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 (згідно з документацією ), який я не використовую правильно в цьому контексті.

Є мільярди прикладів того, як використовувати цю команду з "вбудованим зворотним викликом", але я не зміг знайти жодної з зворотним викликом у формі функції. Будь-яка ідея, як це вирішити?

Відповіді:


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

Функція оболонки існує лише всередині оболонки, де вона визначена. Аналогічно, метод 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"

Shell програмування Примітка: завжди ставлять подвійні лапки підстановок змінних і команд замін: "$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 приймає команду shell, а не команду git.)
idbrii
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.