ฉันต้องการทราบว่ามีวิธีใดที่จะบอกได้ว่าสาขาในพื้นที่นั้นกำลังติดตามสาขาระยะไกลใน Git หรือไม่
ฉันใช้เซิร์ฟเวอร์ระยะไกลหนึ่งตัวซึ่งมีชื่อว่า "origin"
ฉันต้องการทราบว่ามีวิธีใดที่จะบอกได้ว่าสาขาในพื้นที่นั้นกำลังติดตามสาขาระยะไกลใน Git หรือไม่
ฉันใช้เซิร์ฟเวอร์ระยะไกลหนึ่งตัวซึ่งมีชื่อว่า "origin"
คำตอบ:
ใช้ตัวอย่างสำเนาหุ่นของฉันเช็คเอาท์จากที่เก็บ Git upstream บน Github.com ...
$ git remote show origin
* remote origin
Fetch URL: git://github.com/reductivelabs/puppet.git
Push URL: git://github.com/reductivelabs/puppet.git
HEAD branch: master
Remote branches:
0.24.x tracked
0.25.x tracked
2.6.x tracked
master tracked
next tracked
primordial-ooze tracked
reins-on-a-horse tracked
testing tracked
testing-17-march tracked
testing-18-march tracked
testing-2-april tracked
testing-2-april-midday tracked
testing-20-march tracked
testing-21-march tracked
testing-24-march tracked
testing-26-march tracked
testing-29-march tracked
testing-31-march tracked
testing-5-april tracked
testing-9-april tracked
testing4268 tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
ถ้าฉันจะทำสิ่งต่อไปนี้:
$ git checkout -b local_2.6 -t origin/2.6.x
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'
และสุดท้ายรันgit remote show origin
คำสั่งอีกครั้งฉันจะเห็นสิ่งต่อไปนี้ใกล้ด้านล่าง:
Local branches configured for 'git pull':
local_2.6 merges with remote 2.6.x
master merges with remote master
git fetch
หรือgit pull
ปรับปรุงสาขาระยะไกลจะถูกติดตามในพื้นที่เก็บข้อมูลโคลนของคุณ สาขาในพื้นที่เป็นเพียงสาขาในท้องถิ่นของสาขาระยะไกลดังนั้นการปรับปรุงสาขาระยะไกลจะถูกติดตามและผสานในเมื่อได้รับคำสั่งที่เหมาะสมในการทำเช่นนั้น ฉันรวมตัวเลือก '-t' ไว้อย่างชัดเจนเมื่อสร้างสาขาในพื้นที่เพื่อให้แน่ใจว่าติดตามสาขาที่มาจาก โปรดจำไว้ว่าสาขาในท้องถิ่นยังสามารถติดตามสาขาในพื้นที่อื่นได้ดังนั้นจึงไม่จำเป็นต้องเป็นสาขาระยะไกล
git remote show remote-name
อ้างถึง"การติดตามสาขา" (สแนปชอตของสาขาจากที่เก็บข้อมูลระยะไกล) บรรทัด "ผสานกับ" อ้างถึงสาขาในท้องถิ่นที่มีการกำหนดค่า"สาขาต้นน้ำ" (สร้างด้วยตัวเลือก--track
/ -t
ของสาขาGitหรือการชำระเงิน Gitและมักสับสนกับ "สาขาการติดตาม")
สำหรับทุกสาขา:
git branch -avv
สำหรับสาขาท้องถิ่นเท่านั้น:
git branch -lvv
สำหรับสาขาระยะไกลเท่านั้น:
git branch -rvv
แสดงให้คุณเห็นทุกสาขาเช่นเดียวกับชื่อของสาขาต้นน้ำ
git branch -lvv
แสดงผลเฉพาะสาขาในท้องถิ่นที่มีอัปสตรีมอาจเป็นประโยชน์
git branch -vv
ใช้ได้กับฉัน ...
เจเรมี Bouse แสดงให้เห็นถึงวิธีการgit remote show
แสดงข้อมูลการติดตาม นั่นควรจะเพียงพอหากคุณต้องการข้อมูลเพื่อการบริโภคของมนุษย์เท่านั้น
หากคุณวางแผนที่จะใช้ข้อมูลในบริบทอัตโนมัติ (เช่นสคริปต์) คุณควรใช้ระดับล่าง ("ประปา") git for-each-ref
แทน
% git remote show origin
* remote origin
⋮
Local branches configured for 'git pull':
master merges with remote master
pu merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu
git for-each-ref
เรียนรู้%(upstream)
เครื่องหมายในGit 1.6.3 ด้วย Git เวอร์ชันก่อนหน้าคุณจะต้องดึงข้อมูลการติดตามด้วยgit config branch.<name>.remote
และgit config branch.<name>.merge
(อาจใช้git for-each-ref
เพื่อสร้างคำสั่งสำหรับชื่อสาขาท้องถิ่นแต่ละรายการ)
git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
สำหรับสาขาใดสาขาหนึ่งคุณสามารถใช้git rev-parse
กับ@{u}
หรือ@{upstream}
ต่อท้ายชื่อสาขาเช่น:
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master
... หรือสำหรับแบบย่อให้เพิ่ม --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master
โดยทั่วไปคุณสามารถใช้branch@{upstream}
ไวยากรณ์ได้ทุกที่ที่คาดว่าจะกระทำ
git rev-parse --symbolic-full-name HEAD
กับgit rev-parse --symbolic-full-name HEAD@{u}
ขอบคุณ!
ฉันใช้เชลล์สคริปต์ต่อไปนี้ (ชื่อgit-tracks
) เพื่อแสดงสาขาระยะไกลที่ถูกติดตามโดยสาขาปัจจุบัน:
#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}
echo "${remote:?}/${remoteBranch:?}"
สิ่งนี้สามารถใช้ที่กล่าวถึงgit for-each-ref
แต่ฉันพบว่าการเข้าถึงโดยตรงค่อนข้างง่ายกว่าการกรองเอาท์พุทสำหรับสาขาปัจจุบัน
set -e
แต่มักจะยึดติดกับการตรวจสอบที่ชัดเจน แต่ในกรณีนี้มันดีกว่าจริงๆ
git version 1.9.4
ไม่ทำงานสำหรับฉันใน Echos ไม่มีอะไร :(
.git/config
ไฟล์ยังจะให้ข้อมูลสาขาการติดตามเป็น
[remote "Hub"]
url = ssh://xxxx/tmp/Hub
fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
remote = Hub
merge = refs/heads/develop
[branch "Dev1"]
remote = Test
merge = refs/heads/Dev1
[remote "Test"]
url = ssh://xxxx/tmp/gittesting/Dev1GIT
fetch = +refs/heads/*:refs/remotes/Test/*
git branch -vv
แสดงให้เห็นสิ่งที่คุณขอ มันแสดงให้เห็นถึงสาขาในประเทศพร้อมกับสาขาระยะไกลที่เกี่ยวข้องที่พวกเขากำลังติดตาม
เพิ่มอักษรรูนเหล่านี้ใน[alias]
ส่วนของไฟล์. gitconfig ของคุณ:
show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'
ฉันต้องการค้นหาสาขาระยะไกลที่สอดคล้องกัน (ถ้ามี) สำหรับแต่ละสาขาท้องถิ่นภายในลูปที่ทำหน้าที่ในรายการของสาขาท้องถิ่น ฉันลงเอยด้วยการใช้สิ่งต่อไปนี้:
git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"
สิ่งนี้จะไม่แสดงผลใด ๆ (สตริงว่าง) สำหรับสาขาท้องถิ่นที่ไม่มีสาขาระยะไกลที่สอดคล้องกัน ("someremote / somebranch")
ลองgit branch
ด้วยตัวเลือก :
-r
List or delete (if used with -d) the remote-tracking branches.
-a
List both remote-tracking branches and local branches.
.git/config
มิฉะนั้นการตรวจสอบของคุณ