Câu trả lời:
Rất nhiều lệnh sứ, không tốt nếu bạn muốn điều này cho kịch bản:
git branch -vv # doubly verbose!
Lưu ý rằng với git 1.8.3, nhánh ngược dòng đó được hiển thị màu xanh lam (xem " Theo dõi nhánh này (nếu có gì) trong git? ")
Nếu bạn muốn đầu ra sạch, hãy xem câu trả lời của arcresu - nó sử dụng lệnh sứ mà tôi không tin là đã tồn tại vào thời điểm ban đầu tôi viết câu trả lời này, vì vậy nó ngắn gọn hơn một chút và hoạt động với các nhánh được cấu hình để rebase, không chỉ hợp nhất.
git remote show origin
Thay thế 'nguồn gốc' bằng bất cứ tên nào của điều khiển từ xa của bạn.
git remote show
lệnh đó thực sự kết nối với repo từ xa ... và do đó không thành công nếu bạn
git remote show -n origin
để lấy một số thông tin ngay cả khi ngoại tuyến. Từ tài liệu từ xa git : "Với tùy chọn -n, đầu từ xa không được truy vấn trước bằng git ls-remote <name>; thông tin được lưu trong bộ nhớ cache được sử dụng thay thế."
git remote show | xargs git remote show -n
để xem thông tin theo dõi kết hợp cho tất cả các điều khiển từ xa.
Nếu bạn nhìn vào trang man git-rev-parse
, bạn sẽ thấy cú pháp sau được mô tả:
<branchname>@{upstream}
, Ví dụmaster@{upstream}
,@{u}
Hậu tố
@{upstream}
cho một<branchname>@{u}
tên nhánh (dạng ngắn ) đề cập đến nhánh mà nhánh được chỉ định bởi tên nhánh được đặt để xây dựng trên đầu trang. Một tên nhánh bị thiếu mặc định cho tên hiện tại.
Do đó để tìm thượng nguồn của chi nhánh master
, bạn sẽ làm:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
Để in thông tin cho từng chi nhánh, bạn có thể làm một cái gì đó như:
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
# ...
Điều này là sạch hơn so với phân tích cú pháp refs và cấu hình bằng tay.
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
Lưu ý hai dấu sao ở cuối mẫu toàn cầu.
git rev-parse --abbrev-ref HEAD@{upstream}
dường như làm việc độc đáo cho các chi nhánh hiện tại. Nó cũng làm cho một bí danh git tốt đẹp.
while
cú pháp vòng lặp trông hơi lạ với tôi. Bạn chỉ có thể sử dụng git for-each-ref ... | while read branch; do ...
mà không cần một bộ xếp hình và chạy theo thứ tự giống như các lệnh được viết.
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Một cách khác để trả lời cho câu trả lời của kubi là xem .git/config
tập tin hiển thị cấu hình kho lưu trữ cục bộ:
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
sẽ hiển thị một dòng cho mỗi chi nhánh địa phương. Một nhánh theo dõi sẽ trông như:
master <- origin/master
Một người không theo dõi sẽ trông giống như:
test <-
git branch -vv
. 🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
Đối với chi nhánh hiện tại , đây là hai lựa chọn tốt:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
hoặc là
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
Câu trả lời đó cũng ở đây , cho một câu hỏi hơi khác được đánh dấu (sai) là trùng lặp.
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
.
Đối với chi nhánh hiện tại, bạn cũng có thể nói git checkout
(w / o bất kỳ chi nhánh nào). Đây là một no-op với tác dụng phụ để hiển thị thông tin theo dõi, nếu tồn tại, cho chi nhánh hiện tại.
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
, mà không phải là không có.
Tôi sử dụng bí danh này
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'
sau đó
git track
Dựa trên câu trả lời của Olivier Refalo
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
Nó chỉ hiển thị cục bộ với theo dõi được cấu hình.
Viết nó vào một kịch bản gọi là git-track trên con đường của bạn một bạn sẽ nhận được một git theo dõi lệnh
Một phiên bản công phu hơn trên https://github.com/albfan/git-showupstream
git config --get-regexp "branch\.$current_branch\.remote"
sẽ cung cấp cho bạn tên của điều khiển từ xa đang được theo dõi
git config --get-regexp "branch\.$current_branch\.merge"
sẽ cung cấp cho bạn tên của chi nhánh từ xa đang được theo dõi.
Bạn sẽ cần thay thế $ current_branch bằng tên của chi nhánh hiện tại của bạn. Bạn có thể có được điều đó một cách linh hoạt vớigit rev-parse --abbrev-ref HEAD
Các kịch bản nhỏ sau đây kết hợp những điều đó. Dán nó vào một tệp có tên git-tracking
, làm cho nó có thể thực thi được và đảm bảo rằng nó nằm trong đường dẫn của bạn.
sau đó bạn có thể nói
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
lưu ý rằng tên chi nhánh từ xa có thể khác với tên chi nhánh địa phương của bạn (mặc dù tên này thường không). Ví dụ:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
như bạn có thể thấy trong mã, chìa khóa cho việc này là trích xuất dữ liệu từ cấu hình git. Tôi chỉ sử dụng sed để xóa dữ liệu không liên quan.
#!/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"