Git alt modülünü foreach işleviyle birlikte kullanın


10

Benim niyetim, hangi dalın verildiğine göre tüm git alt modüllerini güncelleyen bir komut dosyasına sahip olmak. Bir alt modül için böyle bir dal yoksa, master kullanılır.

Şimdi sahip olduğum şey bu:

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

Ancak bu komut dosyasını çalıştırırken hata atılır:

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.

Benim tahminim bu bağlamda doğru git submodule foreachkullanmadığım eval ( belgelere göre ) kullanır.

Bu komutu "satır içi geri arama" ile nasıl kullanılacağına dair milyarlarca örnek var, ancak geri çağırma işlevi ile tek bir tane bulamadım. bunu nasıl çözeceğimize dair bir fikri olan?

Yanıtlar:


7

İşlevi tırnak içinde bir geri arama olarak koyarak sorunumu çözdüm:

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

Gibi değişkenlerin $1komut dosyasının ad alanındaki değişkenler olduğunu unutmayın . "Kalanlar" gibi $\(bar), \$branch"geri arama" içinde değerlendirilir. Oldukça kolaydı.


7

İşlevleri kullanabilirsiniz, ancak önce bunları dışa aktarmanız gerekir:

export -f pbranch

Ayrıca, bash sözdizimi uzantılarını istiyorsanız, bir bash kabuğunun başlatılmasını zorlamak isteyebilirsiniz:

git submodule foreach bash -c 'pbranch'

5

Kabuk işlevi yalnızca tanımlandığı kabuğun içinde bulunur. Benzer şekilde, bir Java yöntemi yalnızca tanımlandığı program örneğinde bulunur ve bu böyle devam eder. Bu program, orijinal kabuğun alt işlemi tarafından çalıştırılan başka bir kabuk olsa bile, başka bir programdan kabuk işlevi çağıramazsınız.

Bir işlev tanımlamak yerine pbranchayrı bir komut dosyası oluşturun. PATH'nize koyun.

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

Kabuk programlama not: değişken değiştirmeler ve komut değiştirmelerin etrafında hep bir yerlerde çift tırnak: "$foo", "$(foo)", size tırnak dışarıda bırakın gerektiğini bilmedikçe. Korunmasız sübstitüsyonlar, neredeyse hiç istenmeyen boşlukla ayrılmış glob kalıpları listesi olarak yorumlanır. Ayrıca, geri dikişleri kullanmayın, benzer nedenlerle $(…)bunun yerine kullanın. Burada, git şube adları özel karakterler içermediği ve boş olduğu zaman da doğru olduğu [ -z $branch ]için ayrıştırıldığı için aslında önemli değil . Ama alıntıları ihmal etme alışkanlığına girmeyin, geri dönecek ve sizi ısıracaktır.[ -z ]branch

Diyelim ki komut dosyası çağrıldı pbranch-submodule, daha sonra çalıştırabilirsiniz

git submodule foreach pbranch-submodule

Ve adını verirseniz git-pbranch-submodule, yerleşik bir git komutu gibi davranabilir: git pbranch-submoduleveya git submodule foreach git pbranch-submodule. (Foreach komutunun git komutunu değil bir kabuk komutunu kabul ettiğini unutmayın.)
idbrii
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.