ฉันรู้ว่าฉันสามารถทำได้git branch --all
และนั่นแสดงให้ฉันเห็นทั้งในและนอกเมือง แต่มันก็ไม่มีประโยชน์ที่จะแสดงความสัมพันธ์ระหว่างพวกเขา
ฉันจะแสดงรายการกิ่งไม้ในวิธีที่แสดงว่าสาขาท้องถิ่นกำลังติดตามรีโมตใด
ฉันรู้ว่าฉันสามารถทำได้git branch --all
และนั่นแสดงให้ฉันเห็นทั้งในและนอกเมือง แต่มันก็ไม่มีประโยชน์ที่จะแสดงความสัมพันธ์ระหว่างพวกเขา
ฉันจะแสดงรายการกิ่งไม้ในวิธีที่แสดงว่าสาขาท้องถิ่นกำลังติดตามรีโมตใด
คำตอบ:
คำสั่งเครื่องเคลือบดินเผามากไม่ดีถ้าคุณต้องการสิ่งนี้สำหรับการเขียนสคริปต์:
git branch -vv # doubly verbose!
โปรดทราบว่าด้วย git 1.8.3 สาขาต้นน้ำจะปรากฏเป็นสีน้ำเงิน (ดู " การติดตามสาขานี้คืออะไร (ถ้ามี) ในคอมไพล์ ")
หากคุณต้องการผลลัพธ์ที่สะอาดดูคำตอบของ arcresu - ใช้คำสั่งเครื่องเคลือบดินเผาที่ฉันไม่เชื่อว่ามีอยู่ในตอนแรกที่ฉันเขียนคำตอบนี้ดังนั้นมันจึงค่อนข้างกระชับและทำงานกับกิ่งที่กำหนดค่าไว้สำหรับการรีบูตไม่ใช่แค่ผสาน
git remote show origin
แทนที่ 'ต้นกำเนิด' ด้วยชื่อใด ๆ ของรีโมทของคุณ
git remote show
คำสั่งที่จริง ๆ แล้วเชื่อมต่อกับ repo ระยะไกล ... และด้วยเหตุนี้มันจึงล้มเหลวถ้าคุณบังเอิญออนไลน์หรือไม่สามารถเชื่อมต่อกับ repo ได้ไม่ว่าด้วยเหตุผลอะไรก็ตาม ...
git remote show -n origin
เพื่อรับข้อมูลบางอย่างแม้ในขณะออฟไลน์ จากเอกสารรีโมต git : "ด้วยตัวเลือก -n หัวรีโมตจะไม่ถูกสอบถามก่อนด้วย git ls-remote <name> ข้อมูลแคชจะถูกนำมาใช้แทน"
git remote show | xargs git remote show -n
เพื่อดูข้อมูลการติดตามแบบรวมสำหรับรีโมททั้งหมด
หากคุณดูที่หน้า man สำหรับgit-rev-parse
คุณจะเห็นคำอธิบายไวยากรณ์ต่อไปนี้:
<branchname>@{upstream}
เช่นmaster@{upstream}
,@{u}
คำต่อท้าย
@{upstream}
ไปยัง branchname (รูปแบบสั้น<branchname>@{u}
) หมายถึงสาขาที่สาขาที่ระบุโดย branchname ถูกตั้งค่าให้สร้างบน branchname ที่ขาดหายไปมีค่าเริ่มต้นเป็นค่าปัจจุบัน
ดังนั้นเพื่อค้นหาต้นน้ำของสาขาmaster
คุณจะทำ:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
หากต้องการพิมพ์ข้อมูลสำหรับแต่ละสาขาคุณสามารถทำสิ่งต่อไปนี้
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)
# Output:
# master tracks origin/master
# ...
นี่คือสะอาดกว่าการแยกอ้างอิงและกำหนดค่าด้วยตนเอง
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
สังเกตเครื่องหมายดอกจันสองตัวที่ส่วนท้ายของรูปแบบ glob
git rev-parse --abbrev-ref HEAD@{upstream}
ดูเหมือนว่าจะทำงานได้ดีสำหรับสาขาปัจจุบัน นอกจากนี้ยังทำให้นามแฝงคอมไพล์ดี
while
ไวยากรณ์ห่วงลักษณะบิตแปลกกับผม คุณสามารถใช้git for-each-ref ... | while read branch; do ...
ซึ่งไม่ต้องการ FIFO และทำงานในลำดับเดียวกันเช่นคำสั่งที่เขียน
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
ทางเลือกอื่นสำหรับคำตอบของ kubi คือดู.git/config
ไฟล์ที่แสดงการกำหนดค่าที่เก็บในเครื่อง:
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
จะแสดงบรรทัดสำหรับแต่ละสาขาท้องถิ่น สาขาการติดตามจะมีลักษณะดังนี้:
master <- origin/master
คนที่ไม่ได้ติดตามจะมีลักษณะดังนี้:
test <-
git branch -vv
สวยงามกระชับและการส่งออกที่เป็นจริงอ่านได้มากขึ้นกว่าที่ยอมรับ 🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
สำหรับสาขาปัจจุบันที่นี่มีสองทางเลือกที่ดี:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
หรือ
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
คำตอบนั้นก็อยู่ที่นี่เช่นกันสำหรับคำถามที่แตกต่างกันเล็กน้อยซึ่งทำเครื่องหมาย (ผิด) ซ้ำซ้อน
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
ขึ้นอยู่กับว่าทุกสาขาสามารถแสดงในแฟชั่นมิตรสคริปต์:
สำหรับสาขาปัจจุบันคุณสามารถพูดได้git checkout
(ไม่มีสาขาใด ๆ ) นี่คือไม่มีการ op ด้วยผลข้างเคียงเพื่อแสดงข้อมูลการติดตามถ้ามีสำหรับสาขาปัจจุบัน
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
ซึ่งไม่ใช่แบบไม่มี op
ฉันใช้นามแฝงนี้
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
แล้วก็
git track
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '' ]
then
echo $REMOTES
fi
fi
มันจะแสดงเฉพาะในท้องถิ่นที่มีการกำหนดค่าการติดตาม
เขียนบนสคริปต์ที่เรียกว่าgit-trackบนเส้นทางของคุณคุณจะได้รับคำสั่งgit track
รุ่นที่มีเนื้อหาเพิ่มเติมที่https://github.com/albfan/git-showupstream
git config --get-regexp "branch\.$current_branch\.remote"
จะให้ชื่อของรีโมตที่ถูกติดตาม
git config --get-regexp "branch\.$current_branch\.merge"
จะให้ชื่อสาขาระยะไกลที่ถูกติดตาม
คุณจะต้องแทนที่ $ current_branch ด้วยชื่อสาขาปัจจุบันของคุณ คุณสามารถรับมันแบบไดนามิกด้วยgit rev-parse --abbrev-ref HEAD
mini-script ต่อไปนี้รวมสิ่งเหล่านั้นเข้าด้วยกัน ติดไว้ในไฟล์ที่ชื่อว่าgit-tracking
ทำให้มันสามารถเรียกใช้ได้และทำให้แน่ใจว่ามันอยู่ในพา ธ ของคุณ
จากนั้นคุณสามารถพูดได้
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
โปรดทราบว่าชื่อสาขาระยะไกลอาจแตกต่างจากชื่อสาขาในพื้นที่ของคุณ (แม้ว่าโดยปกติจะไม่ใช่) ตัวอย่างเช่น:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
อย่างที่คุณเห็นในรหัสกุญแจของสิ่งนี้คือการดึงข้อมูลจากการตั้งค่า git ฉันแค่ใช้ sed เพื่อล้างข้อมูลภายนอก
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
sed -e "s/^.* //" -e "s/refs\/.*\///")
echo "$current_branch -> $remote/$remote_branch"
นี่คือหนึ่งที่เป็นระเบียบและเรียบง่าย สามารถตรวจสอบgit remote -v
ซึ่งจะแสดงที่มาและต้นน้ำทั้งหมดของสาขาปัจจุบัน