Tüm uzak git dallarını yerel dallar olarak izleme


175

Tek bir uzak dalı yerel bir şube olarak izlemek yeterince basittir.

$ git checkout --track -b ${branch_name} origin/${branch_name}

Tüm yerel şubeleri uzaktan kumandaya itmek, gerektiğinde yeni uzak şubeler oluşturmak da kolaydır.

$ git push --all origin

Tersini yapmak istiyorum. Tek bir kaynaktan X sayıda uzak dal varsa:

$ git branch -r 
branch1
branch2
branch3
.
.
.

Her birini manuel olarak oluşturmaya gerek kalmadan tüm bu uzak dallar için yerel izleme dalları oluşturabilir miyim? Şöyle bir şey söyle:

$ git checkout --track -b --all origin

Ben googled ve RTM, ama şimdiye kadar ranza geldi.


3
Tek bir uzak dalı yerel bir şube olarak izlemenin daha da kolay bir yolu var:git checkout --track origin/branchname
Cerran

Tam olarak istediğin bu değil, ama benim için çalışıyor: get git completions: github.com/git/git/blob/master/contrib/completion/… . Sonra uzak dalların bir listesini almak için yazın git pull origin ve tabbasın. Sonra yazmaya devam edin ve vurun return.
Max Heiber

Yanıtlar:


111

Bash kullanma:

git 1.9.1'den sonra
for i in `git branch -a | grep remote | grep -v HEAD | grep -v master`; do git branch --track ${i#remotes/origin/} $i; done

kredi: Val Blant, elias ve Hugo

git 1.9.1 öncesi

Not: git'in (> v1.9.1) sonraki sürümlerinde kullanılırsa aşağıdaki kod neden olur

  1. (bug) Master'ı izlemek için oluşturulan tüm şubeler
  2. (rahatsızlık) Ön ek ile oluşturulmuş tüm yerel şube adlarının oluşturulması origin/
for remote in `git branch -r `; do git branch --track $remote; done

Yerel izleme şubelerinizde hiçbir değişiklik olmadığı varsayılarak şubeleri güncelleyin:

for remote in `git branch -r `; do git checkout $remote ; git pull; done

Belirsiz refname uyarılarını görmezden gelin, git yerel şubeyi olması gerektiği gibi tercih ediyor gibi görünüyor.


2
Refname uyarılarıyla ilgili bilgi için teşekkürler. Bu yardımcı oldu.
Paul

1
Teşekkürler Otto, kodlamanın tek çözüm olacağından şüphelendim. Oldukça basit bir tane sağladınız.
Janson

1
@Jason bugün hala tek çözümü betikliyor mu?
cregox

1
@Cawas: manuel olarak izleme dalları oluşturmak zorundasınız, ancak tüm izlenen dalları getirecek + birleştirecek git pullbir --allanahtarı vardır .
naught101

13
Git 1.9.1'de bu benim için çalışmadı. "git branch --track <banch_name>" istediğimiz uzak dal yerine yerel dal yöneticisini izleyen yeni bir dal <branch_name> oluşturur. Bu komut dosyası, yerel yöneticiye işaret eden bir grup yerel dal yarattı. Aşağıdaki çözümü göndereceğim.
Val Blant

183

Otto tarafından verilen cevap iyidir, ancak oluşturulan tüm dalların adının başlangıcı olarak "orijin /" olacaktır. Son parçanın (sondan / sonra) elde edilen şube adlarınız olmasını istiyorsanız, bunu kullanın:

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done

Ayrıca, belirsiz referanslarla ilgili herhangi bir uyarı vermemenin de yararı vardır.


Git, yerel izleme şube adına "orijin" eklemez.
Adam Dymitruk

14
@adymitruk: Aslında tam olarak benim için OSX 10.6.4'te söylediğim gibi davranıyor, git 1.7.2.2'yi kullanarak (bu yorumdaki en son kararlılık). Otto bile belirsiz yeniden adlandırma uyarılarından bahsediyor - eğer "orijin /" her yerel şube adının bir parçası olmasaydı uyarıların mevcut olması gerekmiyordu. Otto'nun komutunu çalıştırdıktan sonra 'git branch' çıktısı: [master, orijin / HEAD, orijin / grafikler, orijin / master, orijin / üretim, orijin / sahneleme]. Ve benim emrim: [çizelgeler, usta, üretim, sahneleme].
tjmcewan

1
+ Düzenle: nedenini açıklayan makale.gmane.org/gmane.comp.version-control.git/112575 bulundu .
Philip Oakley

8
Kabul ediyorum - bu şu anda "kabul edilen" cevaptan daha iyi bir çözümdür.
tobias.mcnulty

2
Bunun yerine grep -v master, nasıl grep -v /HEAD? Bu, özelleştirmeye gerek kalmadan varsayılan dalı filtreliyor gibi görünüyor
dashrb

22

Buradaki cevapların çoğu, çıktısının ayrıştırılmasını karmaşıklaştırmaktadır git branch -r. forUzaktan kumandadaki tüm kollara karşı izleme dalları oluşturmak için aşağıdaki döngüyü kullanabilirsiniz .

Misal

Diyelim ki bu uzak şubelerim var.

$ git branch -r
  origin/HEAD -> origin/master
  origin/development
  origin/integration
  origin/master
  origin/production
  origin/staging

Yerel olarak zaten master'dan başka bir şey izlemediğimizi doğrulayın:

$ git branch -l    # or using just git branch
* master

İzleme dallarını oluşturmak için bu tek astarı kullanabilirsiniz:

$ for i in $(git branch -r | grep -vE "HEAD|master"); do 
    git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.

Şimdi onaylayın:

$ git branch
  development
  integration
* master
  production
  staging

Bunları silmek için:

$ git br -D production development integration staging 
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).

-vvAnahtarı kullanırsanız, git branchşunları onaylayabilirsiniz:

$ git br -vv
  development xxxxx [origin/development] commit log msg ....
  integration xxxxx [origin/integration] commit log msg ....
* master      xxxxx [origin/master] commit log msg ....
  production  xxxxx [origin/production] commit log msg ....
  staging     xxxxx [origin/staging] commit log msg ....

For döngüsünün dökümü

Döngü temel olarak komutu git branch -rkullanarak çıktıdaki HEAD veya ana dalları filtreleyerek kullanır grep -vE "HEAD|master". Sadece dalların isimlerini origin/ekleyerek alt dize almak için Bash'in dize manipülasyonunu kullanıyoruz ${var#stringtoremove}. Bu, "stringtoremove" dizesini değişkenten kaldıracaktır $var. Bizim durumumuzda dizeyi origin/değişkenten kaldırıyoruz $i.

NOT: Alternatif git checkout --track ...olarak bunu yapmak için de kullanabilirsiniz :

$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do 
    git checkout --track $i; done

Ama özellikle bu yöntemi önemsemiyorum, çünkü bir ödeme yaparken sizi şubeler arasında değiştiriyor. İşiniz bittiğinde sizi oluşturduğu son dalda bırakacaktır.

Referanslar


1
Git sürüm 2.3.2 (Apple Git-55) ile mükemmel çalışır
AndrewD

22

Güncelleme q1 2020: Mohsen Abasi önermektedir yorumlarda 2014 dayalı slm 'ın cevabı , daha basit bir alternatif:

for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); 

Ve kullanır $() eskimiş backticks yerine .

Ben söz gibi başka bir eski yanıt kullanarak git for-each-refbir olasılıkla daha hızlı .
Ve kafa karışıklığının yerini alan yeni (Git 2.23+) git switchkomutunu kullanırdım .git checkout

for i in $(git for-each-ref --format=%(refname:short) \
  --no-merged=origin/HEAD refs/remotes/origin); do \
    git switch --track $i; \
done

Bu şekilde, hayır grep .


Eski (2011) orijinal cevap:

İşte benim tek astar (mshgit1.7.4 ile test edilmiş bir bash kabuğunda):

Kopyala yapıştır için:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname; done

Daha fazla okunabilirlik için:

remote=origin ; // put here the name of the remote you want
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do 
    git branch --set-upstream-to $remote/$brname $brname; 
done
  • yalnızca remotedeğişkente belirttiğiniz uzaktan kumandadan yukarı akış dalları seçer ('origin ' veya geçerli Git repo'nuzun uzaktan kumandalarından biri için belirlediğiniz herhangi bir ad ).
  • dalın adını ifade origin/a/Branch/Name => a/Branch/Nameyoluyla çıkaracaktır awk.
  • yukarı akış dalını (veya ) üzerinden--set-upstream-to-u ayarlayamaz , değil --track:
    Avantajı, dal zaten varsa, başarısız olmaz ve dalın kaynağını değiştirmez, yalnızca branch.xxx.(remote|merge)ayarı yapılandırır .

    branch.aBranchName.remote=origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    

Bu komut, tüm uzak akış yukarı dallar için yerel dallar oluşturur ve uzak ve birleştirme ayarlarını bu uzak dala ayarlar.


5
Bu bana yalnızca uzaktan kumandada bulunan ve karşılık gelen bir yerel şubesi olmayan her dal için "ölümcül: şube" ne olursa olsun "diye bir şey verir.
Chris Dodd

bir şube adı içeriyorsa düşünüyorum / örneğin: özellik / rc-41-bckend, bu çözüm çalışmıyor !!!!
Mohsen Abasi

@VonC "slm" cevabına dayanarak: $ in i $ (git branch -r | grep -vE "HEAD | master" | sed 's / ^ [] \ + //'); git git checkout --track $ i; bitti
Mohsen Abasi

@MohsenAbasi İyi görünüyor. Cevabımda --set-upstream-tobunun yerine kullanmaktan bahsettim --track.
VonC

@MohsenAbasi Daha fazla görünürlük için yanıtınıza alternatifinizi ekledim. Uzak dalları listelemek ve git switchbunun yerine kullanmak için başka bir olası yol ekledim git checkout. Ama (çok iyi) fikriniz kaldı.
VonC

14

Bunu yeterince kolayca yazabilirsiniz, ama ne zaman değerli olacağını bilmiyorum. Bu dallar oldukça hızlı bir şekilde geride kalacaktı ve her zaman güncellemelisiniz.

Uzak dallar otomatik olarak güncel tutulur, bu nedenle yerel dal üzerinde gerçekten çalışmak istediğiniz noktada oluşturmak en kolay yoldur.


2
İyi bir noktaya değindin. Düşündüğüm ana kullanım durumu, uzak git deposuna dayalı yerel bir geliştirme ortamı oluşturmaktır. İlk klonumu yaptığımda, tüm uzak dalları da o zamanki gibi izlemek istiyorum.
Janson

1
Kullanışlı git uptüm yerel şubeleri günceller.
Hugo

iki depo birleştirmek ve uzaktan kumandayı silmek için
endolith

9
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done

4
| grep -v HEADDüzgün çalışması için boru hattına bir eklemek zorunda kaldı .
Elias Dorneles

9

komut dosyası olmadan (boş bir dizinde):

$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout

bundan sonra, tüm uzak şubeler yerel olarak görülecektir.


orijinal (rusça) .


Bu şimdiye kadarki en basit çözüm ve benim için 2.21.0.windows.1'de çalıştı
Rotsiser Mho

7

Powershell kullanmak istiyorsanız ve uzaktan kumandanıza orijin denir. Sonra bu işe yarar.

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}

Bu süper yardımcı oldu, benim git svn clone'drepo ile çalışmak için hafif bir varyasyon kullanarak sona erdi :git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
Nate

Ayrıca, yerel şubelerim zaten mevcut olduğu için küçük bir değişiklik yaptım:git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
ch271828n

3
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

Bunu kullanın ve şu uyarıya sahip olmayacaksınız: refname 'origin / dev' belirsiz


3

İşte @tjmcewan tarafından atıfta bulunan BASH komutunun çözümü:

for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done

Amacım, oluşturulan uzak dalların adının başlangıcı olarak "origin /" olması sorununu çözmek, çünkü $ remote değişkenlerinin hala "origin /" içerdiğini test ettim:

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done

@Tjmcewan'ın BASH'ini test ettikten sonra, yerel olarak 'orijin /' olmadan izlenen tüm dalların isimlerinin neden olduğunu bilmiyorum.
Nick Tsai

1
İlk komut "master" ı takip eden branşlar oluşturur. Çoğu insanın isteyebileceği şeyler bu değil.
Alexei Osipov

@AlexeiOsipov Teşekkürler!
Nick Tsai

2

Tjmcewan'ın yanıtıyla aynı şeyi yapmak için Windows'ta bunu bir toplu iş dosyasından arayın :

for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r

Veya bu komut satırından :

for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r

1

Git 2.23'ten itibaren:

for branch in `git branch -r | grep origin/`; do git switch -t -C ${branch#origin/} $branch; git pull; done

İçin -Cbayrağı git switchzaten varsa oluşturur veya sıfırlar.

git switch belgeleri


0

Şimdiden bazı şubelerinizin kontrol edilmiş olması ve

  • uzaktan kumandanın kalan tüm dallarına göz atın
  • tüm yerel şubelerin uzak şubeleri izlediğinden emin olun

aşağıdaki bash ve zsh uyumlu komut dosyalarını kullanabilirsiniz:

git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done

0
for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do 
    git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; 
done

Açıklama:

satır 1: 'git branch -r' (ardından uzaktan yapılan değişikliklerle ilgili bilgileri güncellemek için 'git remote update') tüm uzak dalları listeler; 'egrep -vw', sonuçta HEAD ve master içeren girişleri vurmak için kullanılır.

satır 3: Adlandırılmış uzak dalı yerel olarak denetlerken izleyin. Yerel şubeler için 'orijin /' son ekini önlemek için basit bir awk kullanılır.


0

Bash kullanma, Tüm şubelere göz atmak istiyorsanız:

for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done

Yeni uzaktan izleme dallarını aşağı çeken bir getirme yaptığınızda, otomatik olarak bunların düzenlenebilir yerel kopyalarına sahip olmadığınızı belirtmek önemlidir.

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.