Bạn không nên sử dụng git branch khi viết script. Git cung cấp giao diện "hệ thống ống nước" được thiết kế rõ ràng để sử dụng trong kịch bản (nhiều triển khai hiện tại và lịch sử của các lệnh Git thông thường (thêm, kiểm tra, hợp nhất, v.v.) sử dụng cùng giao diện này).
Lệnh sửa ống nước bạn muốn là git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Lưu ý: Bạn không cần remotes/
tiền tố trên tham chiếu từ xa trừ khi bạn có các tham chiếu khác khiến origin/master
khớp với nhiều vị trí trong đường dẫn tìm kiếm tên tham chiếu (xem “Tên tham chiếu tượng trưng.…” Trong phần Chỉ định bản sửa đổi của git-rev-parse (1) ). Nếu bạn đang cố gắng explictly tránh sự mơ hồ, sau đó đi với tên ref đầy đủ: refs/remotes/origin/master
.
Bạn sẽ nhận được đầu ra như thế này:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Bạn có thể chuyển đầu ra này thành sh .
Nếu bạn không thích ý tưởng tạo mã shell, bạn có thể từ bỏ một chút tính mạnh mẽ * và làm điều này:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Tên tham chiếu phải an toàn khỏi sự tách từ của trình bao (xem định dạng git-check-ref (1) ). Cá nhân tôi sẽ gắn bó với phiên bản cũ (mã shell được tạo); Tôi tự tin hơn rằng không có gì không phù hợp có thể xảy ra với nó.
Vì bạn đã chỉ định bash và nó hỗ trợ các mảng, bạn có thể duy trì sự an toàn và vẫn tránh tạo ra các lỗi của vòng lặp của bạn:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Bạn có thể làm điều gì đó tương tự với $@
nếu bạn không sử dụng trình bao hỗ trợ mảng ( set --
để khởi tạo và set -- "$@" %(refname)
thêm phần tử).