คุณไม่ควรใช้git branchเมื่อเขียนสคริปต์ Git มีอินเทอร์เฟซ "ท่อประปา"ที่ได้รับการออกแบบมาอย่างชัดเจนเพื่อใช้ในการเขียนสคริปต์ (การใช้งานคำสั่ง Git ปกติในปัจจุบันและในอดีตจำนวนมาก (เพิ่มชำระเงินรวม ฯลฯ ) ใช้อินเทอร์เฟซเดียวกันนี้)
คำสั่งประปาที่คุณต้องการคือคอมไพล์สำหรับแต่ละการอ้างอิง :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
หมายเหตุ: คุณไม่จำเป็นต้องมีremotes/
คำนำหน้าในการอ้างอิงระยะไกลเว้นแต่คุณจะมีการอ้างอิงอื่น ๆ ที่ทำให้เกิดorigin/master
การจับคู่หลายตำแหน่งในเส้นทางการค้นหาชื่ออ้างอิง (โปรดดูที่“ ชื่ออ้างอิงสัญลักษณ์…” ในส่วนการระบุการแก้ไขของ git-rev-parse (1) ). ถ้าคุณกำลังพยายามที่จะหลีกเลี่ยงความคลุมเครือ explictly refs/remotes/origin/master
แล้วไปที่มีชื่อเต็มโทษ:
คุณจะได้ผลลัพธ์ดังนี้:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
คุณสามารถท่อส่งออกนี้ในการดวลจุดโทษ
หากคุณไม่ชอบแนวคิดในการสร้างเชลล์โค้ดคุณสามารถยกเลิกความทนทานได้เล็กน้อย*และทำสิ่งนี้:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* ชื่ออ้างอิงควรปลอดภัยจากการแยกคำของเชลล์ (ดูgit-check-ref-format (1) ) โดยส่วนตัวแล้วฉันจะยึดติดกับเวอร์ชันเดิม (สร้างรหัสเชลล์); ฉันมั่นใจมากขึ้นว่าไม่มีอะไรที่ไม่เหมาะสมเกิดขึ้นกับมัน
เนื่องจากคุณระบุbashและรองรับอาร์เรย์คุณสามารถรักษาความปลอดภัยและยังคงหลีกเลี่ยงการสร้างความกล้าของลูปของคุณ:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
คุณสามารถทำสิ่งที่คล้ายกันได้$@
หากคุณไม่ได้ใช้เชลล์ที่รองรับอาร์เรย์ ( set --
เพื่อเริ่มต้นและset -- "$@" %(refname)
เพิ่มองค์ประกอบ)