Git'te hangi yerel şubenin hangi uzak şubeyi takip ettiğini nasıl söyleyebilirim?


234

Git'te hangi yerel şubenin hangi uzak şubeyi takip ettiğini söylemenin bir yolu olup olmadığını bilmek isterim.

"Köken" adlı bir uzak sunucu kullanıyorum.


Hatalıysam düzeltin ancak 'sunucu yerine varsayılan olarak orijin adı verilen uzak bir şube değil mi?'
Chris Halcrow

Yanıtlar:


196

Kukla kopyamın örneğini kullanarak, Github.com'daki memba Git deposuna baktım ...

$ 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)

O zaman aşağıdakileri uygularsam:

$ 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'

Ve nihayet git remote show originkomutu tekrar çalıştırın, sonra aşağıya doğru aşağıdakini göreceğim:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
Yani bu, birkaç yerel şubeniz olmasına rağmen, tüm uzak şubeleri kukla içerisinde izleyebileceğiniz anlamına mı geliyor? Komuta sonucunda gördüğünüz birçok "izlenen" işaret ne anlama geliyor? hangi yerel şube tarafından "izleniyor"?
PJ.

Uzak dallar izlenir, öyle yaparsanız git fetchveya git pulluzak dallarda yapılan güncellemeler klonlanmış deponuzda izlenir. Yerel şubeler aynen öyledir, uzak şubelerin yerel şubeleri ve dolayısıyla uzak şubelere yapılan güncellemeler izlenecek ve uygun komut verildiğinde birleştirilecektir. Yerel şubeyi oluşturduğu şubeyi takip etmesi için yerel şubeyi yaparken açıkça '-t' seçeneğini ekliyorum. Yerel bir şubenin başka bir yerel şubeyi de takip edebileceğini unutmayın, bu nedenle uzak bir şube olmak zorunda değildir.
Jeremy Bouse,

5
@PJ: “track” teriminin Git'te iki farklı anlamı vardır. İçinde “izlenen” satırları git remote show remote-namebakın “izleme dalları” (uzaktan depolardan şube anlık). “Birlikte birleştirme” çizgileri, “yukarı akış dalı” yapılandırmasına sahip yerel dalları ifade eder ( git dalı veya git ödeme--track / -tseçeneğiyle yapılan ve bu nedenle genellikle “izleme dalları” ile karıştırılır).
Chris Johnsen,

" uzaktan izleme şubesi ", yukarıda belirtilen "takip şubeleri" için güncel sözlük girişidir. Doküman 8b3f3f84’de güncellendi .
ento

124

Tüm şubeler için:

git branch -avv

Sadece yerel şubeler için:

git branch -lvv

Yalnızca uzak dallar için:

git branch -rvv

tüm şubelerin yanı sıra akış yukarı dalın adını da gösterir.


2
Bu, bugüne kadarki en basit ve en dolu cevap!

6
Git 1.7.7.5 sürümünde bu, yerel şubeyi ve gösterdiği sha-1'i gösteriyor, ancak izlenen uzak şubeyi göstermiyor ...
mpontillo

Git sürümünde benim için çalışıyor 1.7.4.1 Uzaktan izleme şubesini göstermek için ikinci 'v' gereklidir.
Peter Johnson

4
Çıktı git branch -lvvgösterisini azaltmak için sadece yukarı yönlü yerel şubeler yararlı olabilir
AB

5
^ git branch -vvbenim için çalışıyor ...
notacouch

52

Jeremy Bouse , izleme bilgilerinin nasıl git remote showgörüntülendiğini gösterir . Sadece insan tüketimi için bilgi istiyorsanız bu yeterli olacaktır.

Bilgileri otomatik bir bağlamda (örneğin bir senaryo) kullanmayı planlıyorsanız, git for-each-refbunun yerine alt seviyeyi (“tesisat”) kullanmanız gerekir.

% 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Öğrenilen %(upstream)içinde belirteci Git 1.6.3 . Git'in önceki sürümlerinde, izleme bilgilerini git config branch.<name>.remoteve ile çıkartmanız gerekecektir git config branch.<name>.merge(muhtemelen git for-each-refher yerel dal adı için komutlar oluşturmak için).


Cevaplarınızın çıktısı çok daha özlü ve takip etmesi kolaydır, bu yüzden yukarı oy alırsınız :)
CubanX

Daha az özlü olmak için, ancak uzak adların yerel dal adlarıyla aynı olup olmadığını görsel olarak kontrol etmenin iyi bir yolunu sağlamak için, genel bir git gotcha: bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

Belirli bir dal için kullanabilirsiniz git rev-parseile @{u}veya @{upstream}şube adı, örneğin üzerine soneki:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... veya kısaltılmış form için --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Genellikle bir branch@{upstream}sözdiziminin beklendiği yerde kullanabilirsiniz .


1
+1 Cevabınız bana tam ihtiyacım olanı verdi: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, teşekkürler!
Tino,

10

git-tracksGeçerli dal tarafından izlenen uzak dalı göstermek için aşağıdaki kabuk komut dosyasını (adlandırılmış ) kullanıyorum:

#!/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:?}"

Bu, belirtilenleri de kullanabilir git for-each-ref, ancak doğrudan erişimi, geçerli dalın çıkışını filtrelemekten biraz daha basit buldum.


Komut dosyasının en üstünde "set -e" kullanmayı düşünebilirsiniz. Bu, "|| exit $?" Örneklerinin tümünü kaldırmanıza izin verir. aynı başarısız-erken davranışını koruyarak.
John Whitley

@ JohnWhitley: Teşekkürler, cevabımı düzelttim. Biliyorum set -e, ama genellikle açık denetime sadık kal. Ancak bu durumda, gerçekten daha iyi.
Ingo Karkat

Benim için çalışmıyor git version 1.9.4. Echos hiçbir şey :(
Ain

8

.git/config dosya ayrıca izleme şubesi bilgilerini de sağlayacaktır.

[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/*

5
git branch -vv

tam olarak ne istediğini gösterir. Yerel şubeleri, takip ettikleri uzak şubeyle birlikte gösterir.


2

Bu [alias]runeleri .gitconfig dosyanızın bölümüne ekleyin:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

Yerel şubelerin bir listesine etki eden bir döngü içindeki her bir yerel şube için (varsa) karşılık gelen uzak şubeyi bulmam gerekiyordu. Aşağıdakileri kullanarak sona erdi:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Bu, karşılık gelen uzak bir dalı ("someremote / somebranch") olmayan yerel dallar için hiçbir şey (boş bir dize) çıkarmaz.


-1

git branch Seçeneklerle deneyin :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

Aksi takdirde, inceleyin .git/config.


3
Şubeler gösteriyorlar, ama hangisinin hangisini takip ettiğini anlamıyorum.
PJ.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.