Tôi muốn biết liệu có cách nào để biết chi nhánh địa phương nào đang theo dõi chi nhánh từ xa nào trong Git không.
Tôi đang sử dụng một máy chủ từ xa, được đặt tên là "nguồn gốc".
Tôi muốn biết liệu có cách nào để biết chi nhánh địa phương nào đang theo dõi chi nhánh từ xa nào trong Git không.
Tôi đang sử dụng một máy chủ từ xa, được đặt tên là "nguồn gốc".
Câu trả lời:
Sử dụng ví dụ về bản sao Puppet của tôi đã được kiểm tra từ kho lưu trữ Git ngược dòng trên 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)
Sau đó, nếu tôi đã thực hiện như sau:
$ 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'
Và cuối cùng chạy lại git remote show origin
lệnh một lần nữa, sau đó tôi sẽ thấy phần dưới gần phía dưới:
Local branches configured for 'git pull':
local_2.6 merges with remote 2.6.x
master merges with remote master
git fetch
hoặc git pull
cập nhật lên các nhánh từ xa sẽ được theo dõi trong kho lưu trữ nhân bản của bạn. Các nhánh cục bộ chỉ là như vậy, các nhánh cục bộ của các nhánh từ xa và do đó cập nhật cho các nhánh từ xa sẽ được theo dõi và hợp nhất khi lệnh thích hợp để làm như vậy được đưa ra. Tôi rõ ràng bao gồm tùy chọn '-t' khi tạo nhánh cục bộ để đảm bảo nó theo dõi nhánh mà nó bắt nguồn từ đó. Hãy nhớ rằng một chi nhánh địa phương cũng có thể theo dõi một chi nhánh địa phương khác để không phải là một chi nhánh từ xa.
git remote show remote-name
đề cập đến các nhánh theo dõi trên nền tảng khác (các ảnh chụp nhanh của các nhánh từ kho lưu trữ từ xa). Các dòng sáp nhập với các dòng khác đề cập đến các nhánh địa phương có cấu hình nhánh nhánh ngược dòng của Google (được thực hiện với tùy chọn --track
/ -t
của nhánh git hoặc thanh toán git và do đó thường bị nhầm lẫn với các nhánh theo dõi của Drake).
Đối với tất cả các chi nhánh:
git branch -avv
Chỉ dành cho các chi nhánh địa phương:
git branch -lvv
Chỉ dành cho các chi nhánh từ xa:
git branch -rvv
cho bạn thấy tất cả các nhánh cũng như tên của nhánh ngược dòng.
git branch -lvv
chỉ hiển thị các nhánh cục bộ với thượng nguồn có thể hữu ích
git branch -vv
làm việc cho tôi ...
Jeremy Bouse minh họa cách git remote show
hiển thị thông tin theo dõi . Điều đó là đủ nếu bạn chỉ muốn thông tin cho con người.
Nếu bạn có kế hoạch sử dụng thông tin trong ngữ cảnh tự động (ví dụ: tập lệnh), bạn nên sử dụng mức thấp hơn ( git for-each-ref
Thay thế hệ thống ống nước) .
% 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
Mã thông báo git for-each-ref
đã học %(upstream)
trong Git 1.6.3 . Với các phiên bản Git trước đó, bạn sẽ phải trích xuất thông tin theo dõi git config branch.<name>.remote
và git config branch.<name>.merge
(có thể sử dụng git for-each-ref
để xây dựng các lệnh cho từng tên nhánh cục bộ).
git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
Đối với một nhánh cụ thể, bạn có thể sử dụng git rev-parse
với @{u}
hoặc @{upstream}
hậu tố trên tên nhánh, ví dụ:
$ git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master
... hoặc cho dạng viết tắt, thêm --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master
Bạn thường có thể sử dụng branch@{upstream}
cú pháp bất cứ nơi nào một cam kết được mong đợi.
git rev-parse --symbolic-full-name HEAD
vs. git rev-parse --symbolic-full-name HEAD@{u}
, cảm ơn!
Tôi sử dụng tập lệnh shell sau (có tên git-tracks
) để hiển thị nhánh từ xa được theo dõi bởi nhánh hiện tại:
#!/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:?}"
Điều này cũng có thể sử dụng được đề cập git for-each-ref
, nhưng tôi thấy việc truy cập trực tiếp có phần đơn giản hơn so với việc lọc đầu ra cho nhánh hiện tại.
set -e
, nhưng thường dính vào kiểm tra rõ ràng. Nhưng trong trường hợp này, nó thực sự tốt hơn.
git version 1.9.4
. Echos nothing :(
.git/config
tập tin cũng sẽ cung cấp thông tin chi nhánh theo dõi như
[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/*
Tôi cần tìm nhánh từ xa tương ứng (nếu có) cho mỗi nhánh cục bộ trong một vòng lặp đang hoạt động trên một danh sách các nhánh cục bộ. Tôi đã kết thúc bằng cách sử dụng như sau:
git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"
Điều này sẽ không tạo ra gì (một chuỗi trống) cho các nhánh cục bộ không có nhánh từ xa tương ứng ("someremote / somebranch").
Thử git branch
với các tùy chọn :
-r
List or delete (if used with -d) the remote-tracking branches.
-a
List both remote-tracking branches and local branches.
Nếu không, kiểm tra của bạn .git/config
.