Hangi Git dallarının hangi uzak / yukarı akış dalını izlediğini nasıl görebilirim?


824

Yapabileceğimi biliyorum git branch --all, bu da bana hem yerel hem de uzak şubeleri gösteriyor, ancak aralarındaki ilişkileri göstermede o kadar da kullanışlı değil.

Şubeleri hangi yerel şubenin hangi uzaktan kumandayı izlediğini gösterecek şekilde nasıl listeleyebilirim?

Yanıtlar:


1144

Çok porselen bir komut, komut dosyası için bunu istiyorsanız iyi değil:

git branch -vv   # doubly verbose!

Git 1.8.3 ile yukarı akış dalının mavi renkte görüntülendiğini unutmayın (bkz. " Git'te bu dal izleme (varsa) nedir? ")


Temiz çıktı istiyorsanız, arcresu'nun cevabına bakın - bu cevabı yazdığım sırada var olmadığına inanmadığım bir porselen komutu kullanıyor, bu yüzden biraz daha özlü ve sadece birleştirme değil, rebase için yapılandırılmış dallarla çalışıyor.


3
Yukarıdaki ilk yöntem benim için istenen bilgileri sağlamıyor. İkincisi ... Kubi'nin cevabı işe yaradığından, aşırıya kaçmış gibi görünüyor. Bir şey mi kaçırıyorum?
garyp

3
@garyp Soruyu soran siz değilsiniz. Birincisi OP'nin neye ihtiyacı olduğunu, ikincisi ise komut dosyası için temiz bir biçimde istemesi ya da sadece bir takma ad olarak kaydetmek istemesi durumunda tam olarak neye ihtiyacı olduğunu sağladı . ("Overkill" size istediğinizi alırsa ve tekrarlamanız gerekmiyorsa iyidir.) Bu sorunun bakış açısından, kubi'nin cevabı bazı yabancı bilgiler sağlar ve birden fazla uzaktan kumanda varsa, her şeyi göstermez, ama ihtiyaçlarınızı karşılıyorsa, elbette kullanın.
Cascabel

2
Özür borçluyum. Başlangıçta ilk yöntemi çalıştırdığımda, neyin neyi takip ettiği hakkında hiçbir bilgim yok ve bunu açıkça belirtmeliydim. Ama şimdi izleme bilgilerini görüyorum, bu yüzden kurulumumda bir sorunum vardı. Bu yüzden edildi şey eksik.
garyp

2
FWIW Kafam karıştı çünkü -v ve -vv benzer çıktılar gösteriyor. İzlenen dal, karma işleminden sonra ve en son işlemden önce köşeli parantez içinde gösterilir (varsayılan OSX homebrew kurulumumda).
jerclarke

3
Bütün bunlar benim için son taahhüt karmasını yazdırmak ve her dal için yorum yapmaktır.
capybaralet

263

git remote show origin

'Orijini' uzaktan kumandanızın adı ne olursa olsun değiştirin.


11
Bu porselen komut bir insan için çalışıyor olsa da (bir senaryo için çok fazla değil, porselen çıktıyı ayrıştırmak zorunda kalacağı gibi), bu yaklaşımla ilgili sevmediğim şey, git remote showkomutun aslında uzak repoya bağlanması ... ve bu nedenle çevrimdışı olursanız veya herhangi bir nedenle repoya bağlanamıyorsanız başarısız olur ...
pvandenberk

17
@pvandenberk git remote show -n originÇevrimdışı olsanız bile bazı bilgileri almak için kullanabilirsiniz . Gönderen git uzaktan belgeler : "; önbelleğe bilgiler yerine kullanılır -n seçeneği ile uzaktan kafaları <name> ilk git ls-uzaktan ile sorgulanan değildir."
Cerran

5
Bu komutla ilgili garip bir şey: çekme / itme için yapılandırılmış yerel bir şube olmasa bile uzak dalları "izlenen" olarak listeler. Bunu her zaman kafa karıştırıcı buluyorum. Aslında bu çıktıda "izlenen" in ne anlama geldiği konusunda net değilim. Konuyla ilgili git dokümanlar uzak bir şube "izlenen" olduğu gibi konuşuyorsun sadece bağlı olduğunda / itme / çekme için yerel şube ... bağlı
Hawkeye Parker

Sorun, aslında ne aradığımı görene kadar tüm uzak isimler için bunu çağırmam gerekiyor.
jolvi

2
@jolvi git remote show | xargs git remote show -nTüm uzaktan kumandalar için birleşik izleme bilgilerini görüntülemek için koşabilirsiniz .
Synoli

107

İçin man sayfasına bakarsanız git-rev-parse, aşağıdaki sözdiziminin açıklandığını göreceksiniz:

<branchname>@{upstream}, örneğin master@{upstream},@{u}

@{upstream}Şube adının soneki (kısa form <branchname>@{u}), şube adı ile belirtilen şubenin üzerine oluşturulacağı dalı ifade eder. Eksik bir şube adı varsayılan olarak geçerli olanın adıdır.

Bu nedenle dalın yukarı akışını bulmak için masterşunları yaparsınız:

git rev-parse --abbrev-ref master@{upstream}
# => origin/master

Her dal için bilgileri yazdırmak için aşağıdakileri yapabilirsiniz:

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
# ...

Bu, ref'leri ayrıştırmaktan ve manuel yapılandırmadan daha temizdir.


Bulmaya rağmen bu ayrımı biraz anlayamadım, bu yüzden açık bir açıklama için teşekkürler!
Alice Purcell

3
Git-flow kullanan ve "feature / blahblah" adlı şubelerimiz için while döngüsünün kapanış ifadesi şöyle olmalıdır: Glob kalıbının sonundaki iki yıldız işaretini done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)not edin .
markeissler

2
git rev-parse --abbrev-ref HEAD@{upstream}mevcut şube için iyi çalışıyor gibi görünüyor. Ayrıca güzel bir git takma adı yapar.
Digikata

whileDöngü sözdizimi bana biraz garip görünüyor. Sadece git for-each-ref ... | while read branch; do ...FIFO'ya ihtiyaç duymayan ve yazılan komutlarla aynı sırada çalışan kullanabilirsiniz .
Daniel Böhmer

En azından git 2.5.1'den beri, bir tek astarınız vargit for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Mat M

81

Kubi'nin cevabına bir alternatif .git/config, yerel depo yapılandırmasını gösteren dosyaya bir göz atmaktır :

cat .git/config


6
Ayrıca git config --get-regex branch
Tamir Daniely

6
Veya daha spesifik olarak, 'git config --get-regexp branch. * Merge'
yoyo

41
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

her yerel şube için bir satır gösterecektir. Bir izleme dalı şöyle görünecektir:

master <- origin/master

Takip etmeyen biri şöyle görünecektir:

test <- 

Güzel, bazı sipariş ve TAB yatak çıkışı eklemek için
dimir

Güzel özlü ve çıktı aslında kabul edilenden çok daha okunabilir git branch -vv. 🙏
joki

Tek sorun bunu hatırlayamıyorum, bu yüzden kullandımgit config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
joki

38

İçin geçerli dalı, burada iki iyi seçeneklerdir:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline

veya

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline

Bu cevap da burada tekrar olarak işaretlenmiş oldu biraz farklı bir soru (yanlış) için,.


5
Buna dayanarak, tüm dalları bir senaryo dostu moda sıralanabilir: git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads.
Daniel James

15

Mevcut dal için ayrıca git checkout(herhangi bir dal olmadan) diyebilirsiniz . Bu, geçerli şube için varsa izleme bilgilerini gösteren yan etkilere sahip bir işlemdir.

$ git checkout 
Your branch is up-to-date with 'origin/master'.

Yeterince adil, ama yanlışlıkla yazabilirsiniz git checkout ., ki bu hayır-op değil.
Tomasz Gandor

6

Bu takma adı kullanıyorum

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'

sonra

git track

5
İki parametre ile komutunuzun bir parça dalı yapılandırdığını belirtmek gerekir.
albfan

3

Olivier Refalo'nun cevabına dayanarak

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

Yalnızca iz yapılandırılmış yerel ayarları gösterir.

Yolunuza git-track adlı bir betik üzerine yazın, bir git track komutu alacaksınız

Https://github.com/albfan/git-showupstream adresinde daha ayrıntılı bir sürüm


1

git config --get-regexp "branch\.$current_branch\.remote"

size izlenmekte olan uzaktan kumandanın adını verecektir

git config --get-regexp "branch\.$current_branch\.merge"

size izlenmekte olan uzak dalın adını verecektir.

$ Current_branch yerine mevcut şubenizin adını koymanız gerekir. Bunu dinamik olarakgit rev-parse --abbrev-ref HEAD

Aşağıdaki mini komut dosyası bunları birleştirir. Dosya adlı bir dosyaya yapıştırın git-tracking, yürütülebilir yapın ve yolunuzda olduğundan emin olun.

o zaman söyleyebilirsin

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

uzak dal adının yerel dal adınızdan farklı olabileceğini unutmayın (genellikle olmasa da). Örneğin:

$git tracking 
xxx_xls_xslx_thing -> origin/totally_bogus

kodda da görebileceğiniz gibi, bunun anahtarı git yapılandırmadan veri çıkarmaktır. Ben sadece gereksiz verileri temizlemek için sed kullanın.

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

1

İşte temiz ve basit olanı. git remote -vGeçerli şubenin tüm kökenini ve yukarı akışını gösteren kontrol edebilir .

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.