Sử dụng foreach subodule foreach với chức năng


10

Mục đích của tôi là có một kịch bản cập nhật tất cả các mô hình con git theo nhánh nào được đưa ra. Nếu không có nhánh như vậy cho một mô hình con, chủ được sử dụng.

Đây là những gì tôi có bây giờ:

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

Nhưng khi chạy tập lệnh này, lỗi được đưa ra:

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.

Tôi đoán là git submodule foreachsử dụng eval (theo tài liệu ), mà tôi không sử dụng chính xác trong bối cảnh này.

Có hàng tỷ ví dụ về cách sử dụng lệnh này với "gọi lại nội tuyến" nhưng tôi không thể tìm thấy một ví dụ duy nhất với hàm gọi lại dưới dạng hàm. Bất kỳ ý tưởng làm thế nào để giải quyết điều này?

Câu trả lời:


7

Bạn có thể sử dụng các hàm, nhưng trước tiên bạn cần xuất chúng:

export -f pbranch

Ngoài ra, nếu bạn muốn các phần mở rộng cú pháp bash, bạn có thể muốn buộc bash shell được bắt đầu:

git submodule foreach bash -c 'pbranch'

6

Tôi đã giải quyết vấn đề của mình bằng cách đặt chức năng bên trong dấu ngoặc kép dưới dạng gọi lại:

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

Lưu ý rằng các biến như $1là các biến từ không gian tên của tập lệnh. "Những người thoát" như thế $\(bar), \$branchđược đánh giá trong "cuộc gọi lại". Nó khá dễ.


5

Hàm shell chỉ tồn tại bên trong shell nơi nó được xác định. Tương tự, một phương thức Java chỉ tồn tại trong cá thể chương trình nơi nó được định nghĩa, v.v. Bạn không thể gọi một hàm shell từ một chương trình khác, ngay cả khi chương trình đó xảy ra là một shell khác được điều hành bởi một tiến trình con của shell gốc.

Thay vì xác định một chức năng, hãy tạo pbranchmột tập lệnh riêng. Đặt nó trong ĐƯỜNG của bạn.

#!/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 lập trình lưu ý: luôn đặt dấu ngoặc kép quanh thay thế biến và thay thế lệnh: "$foo", "$(foo)", trừ khi bạn biết rằng bạn cần phải rời khỏi dấu ngoặc kép ra. Sự thay thế không được bảo vệ được hiểu là danh sách các mẫu toàn cầu được phân tách bằng khoảng trắng, gần như không bao giờ mong muốn. Ngoài ra, không sử dụng backticks, vì lý do tương tự, sử dụng $(…)thay thế. Ở đây, điều đó không thực sự quan trọng bởi vì tên nhánh git không chứa các ký tự đặc biệt và vì [ -z $branch ]được phân tích cú pháp vì [ -z ]nó cũng đúng khi branchtrống. Nhưng đừng có thói quen bỏ qua các trích dẫn, nó sẽ quay lại và cắn bạn.

Giả sử tập lệnh được gọi pbranch-submodule, sau đó bạn có thể chạy

git submodule foreach pbranch-submodule

Và nếu bạn đặt tên cho nó git-pbranch-submodule, nó có thể hoạt động giống như một lệnh git tích hợp: git pbranch-submodulehoặc git submodule foreach git pbranch-submodule. (Lưu ý rằng foreach chấp nhận lệnh shell chứ không phải lệnh git.)
idbrii
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.