Soru Git'teki tüm uzak dalları nasıl kopyalayabilirim?


Benim bir master ve bir development şube, her ikisi de itti GitHub. Ya sahibim cloned, pulled, ve fetched, ama başka bir şey elde edemem master şube geri.

Eminim bariz bir şeyi kaçırdığına eminim, ama kılavuzu okudum ve hiç sevinç almıyorum.


3560
2017-09-15 22:42


Menşei


Burada kabul edilen cevap (git branch -a) size uzaktan kumandadaki şubeleri gösterir, ancak bunlardan herhangi birini kontrol etmeye çalışırsanız, 'ayrık HEAD' durumunda olursunuz. Bir sonraki cevap (ikinci en yüksek puan) farklı bir soruyu yanıtlıyor (zekâya: bütün dalların nasıl çekileceğini, ve yine, bu sadece yerel olarak izlediğiniz için çalışıyor). Bazı yorumlar, ayrıştırılamayacağınızı gösteriyor. git branch -a Tüm uzak şubeleri yerel olarak takip edecek bir kabuk betiği ile sonuçlanır. Özet: İstediğin şeyi yapmanın yerel yolu yok ve zaten bu kadar iyi bir fikir olmayabilir. - Day Davis Waterbury
Belki tüm klasörü eski moda yoldan kopyalayabilir misin? scp some_user@example.com:/home/some_user/project_folder ~ Bu çözüm github için çalışıyor olsa da emin değilim .. - snapfractalpop
"Klonladım, çektim ve aldım" demekten ziyade kesin komutlar İdam ettin. - Bob Gilmore
"Klon" un neden tam bir nüshasının anlamında olmadığını her zaman boggles. Tam bir klon ise, tüm şubeler yerel depoların bir parçası olmamalıdır? Demek istediğim, dağıtılma noktasından biri değil mi? Bu yüzden bir şeyler deposu gittiğinde, hala her şeyin tam bir kopyası vardır. Yoksa "uzak" denilen şey gerçekten yerel deponun bir parçası mı? - huggie
Tüm upvotes'ları, cevapları, cevaplar hakkındaki yorumları ve akıllara durgunluk veren sayıları görmek, bunu yapmak için bir komut ekledim. Ve haklısın @huggie, düşüncelerim tam olarak. - Sнаđошƒаӽ


Cevaplar:


İlk önce bir uzaktan klonla Git depo ve CD bunun içine:

$ git clone git://example.com/myproject
$ cd myproject

Ardından, deponuzdaki yerel şubelere bakın:

$ git branch
* master

Ama deponuzda saklanan başka dallar var! Bunları kullanarak görebilirsiniz -a bayrak:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Bir üst akış şubesinde hızlı bir göz atmak istiyorsanız, doğrudan kontrol edebilirsiniz:

$ git checkout origin/experimental

Ancak, bu dalda çalışmak istiyorsanız, otomatik olarak yapılan yerel bir izleme dalı oluşturmanız gerekir:

$ git checkout experimental

ve göreceksin

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Bu son satır bazı insanlar atar: "Yeni şube" - ha? Gerçekten anlamı, dalın endeksten alınması ve sizin için yerel olarak oluşturulmasıdır. önceki hat, şubenin genellikle dal / dal_adı şubesi anlamına gelen uzak şubeyi izlemek için kurulduğunu söylerken daha bilgilendirici

Şimdi, yerel şubelere bakarsanız, göreceğiniz şey budur:

$ git branch
* experimental
  master

Kullanarak birden fazla uzak depoyu gerçekte izleyebilirsiniz. git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

Bu noktada, işler oldukça çılgınlaşıyor, bu yüzden koş gitk neler olduğunu görmek için:

$ gitk --all &

4024
2017-09-16 13:28



Birisi tüm uzak şubeleri nasıl otomatik olarak oluşturabilir, ör. kökeni / deneysel deneysel? - Cristian Ciupitu
Cristian: Her zaman her dalın menşe / foo'su için bir 'foo' yaratırdım, fakat bu iki soruna yol açtı: (1) İlgili uzak şubenin arkasında pek çok taahhüt olan birçok eski izleme koluna sarılıyorum. ve (2) git'in daha eski sürümlerinde, 'git push' komutunu çalıştırmak, tüm şubeleri, o dallar bayat olsa bile, bir uzaktan kumandaya itmeye çalışır. Şimdi sadece aktif olarak gelişmekte olduğum şeyler için yerel şubeleri tutuyorum ve onlar hakkında bilgiye ihtiyacım varsa orijin / * dallarına doğrudan erişiyorum. ('Sen şube -a' ayrıştırmak için bir kabuk betiği kullanabilirsiniz dedi.) - emk
"git getir <kök adı> <şube adı>", şubenizi sizin için yerel olarak getirir. - Orange Box
İyi cevap, ama soruyu özlüyorum. Tüm uzak şubeleri kontrol etmek için bir tek hat arıyordum. - cmcginty
Soru, tüm uzak şubeleri klonlamaktı, onları kontrol etmekti. Ve, yukarıda belirttiğim gibi, gerçekten daha fazla yerel izleme dalları yapmak istemiyorsunuz, çünkü gerçekten bayat olduklarında baş ağrılarına neden olabilirler. - emk


Bir kerede almak istediğiniz birçok uzak dalınız varsa, yapın:

$ git pull --all

Artık, uzak depoya çarpmadan, istediğiniz şekilde herhangi bir şubeyi kontrol edebilirsiniz.


745
2018-01-13 16:42



Git klonu yaparsam, ana şubeye ve 10 şubeye "uzaktan" sahibim. Yani Gabe tarafından bu cevap çok yardımcı oldu ve soruya cevap veriyor. - basZero
Bu yalnızca yerel olarak eklenen uzak şubeleri getirmiyor herhangi uzak şube - jujule
İlk komut gereksizdir. basitçe git pull --all aynısını yapacak - sadece iki kez getirmeyecek. Ve infosec812 bu sorunun cevabını vermediği doğru. Bu kadar çok vardiyanın nasıl olduğunu merak ediyorum. - Sven Marnach
Yaptıktan sonra git remote update, sonra denedim git branchBen sadece yerel şubeleri görüyorum. Ama yaparsam git branch -a Şimdi uzak şubeleri görebilirim ve git pull <branchname> istediğim dalı almak için. - Bu soruya bir Google aramasından geldim ve bu cevap benim sorunumu çözdü. - Jazzerus
Bu hiç yararlı değil, mevcut olandan başka uzak bir şube çekmiyor. - Avinash R


Bu darbe script bana yardımcı oldu:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

Master (muhtemelen orijinal klon komutundan aldığınız) hariç tüm uzak dallar için izleme dalları oluşturacaktır. Bence hala bir şeyler yapman gerekebilir.

git fetch --all
git pull --all

emin olmak.

Bir astar: git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs Her zamanki gibi: Bildiğimiz gibi rm -rf evrenini kopyalamaya başlamadan önce kurulumunuzda test edin

Tek liner için kredi kullanıcı cfi gitmek


379
2018-01-21 02:18



Bu gerçekten mükemmel bir çözüm olmaya çok yakın .. Bu işlevsellik git bir seçenek olarak yerleşik ise, daha iyi hale getirecek tek şey. - Deven Phillips
"Bir astar": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs   Her zamanki gibi: kopyalamadan önce kurulumunuzda test edin rm -rf universe as we know it - cfi
Bu komut, uzaktaki normal dalları (özellikli dallar değil) gibi özellik dallarını yaratır - bunu nasıl düzeltebilirsiniz? - Alex2php
Şube adlarında "/" ile ilgili sorun yaşarsanız, git takma ad kullanılarak bir çözüm aşağıdadır. cevabını "hiç kimse" nin "11 Mayıs'ta saat 15: 13'te" yanıtına bakın. " - wemu
Ben sadece kırpıyorum remotes/origin/ ad alanlarını korumak için: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


Kullanmak --mirror seçeneği kopya görünüyor remote dalları uygun şekilde izleme. Bununla birlikte, depoyu çıplak bir depo olarak kurar, böylece daha sonra normal bir depoya geri döndürmeniz gerekir.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

Referans: Git SSS: Uzaktan izlenen tüm şubelerle bir depoyu nasıl kopyalarım?


280
2017-08-27 17:49



Biliyorsun ki, oyu olmasa bile bu oldukça iyi bir cevap gibi görünüyor. Bunu böyle yapmak için herhangi bir tuzak var mı? Bu komutları çalıştırdıktan sonra bir şubeyi açıkça kontrol etmek zorunda kaldım. - loop
Git push --mirror ile birleştirilmiş olan şey, github.com'dan bir github kurumsal kurulumuna geçerken, uzak bir git repo dosyasının tam bir kopyasını oluşturmak için tam olarak gerekenler. Teşekkürler! - Jacob Fike
@Dave: Bir final ekle git checkout En son komut olarak, geçerli dalın başını klonlanmış repoda kontrol etmek. Bu çok iyi bir cevap, en iyisi. Cesur ol, sonunda seni en üste çıkaracağız :-) - cfi
@Dave: Hm. İkinci düşüncelerim var: --mirror, tüm şubeleri takip edilmekten daha fazlasını yapıyor. Tüm referansları kökenden ve takip edenlerden kopyalar. git remote update bunu tekrar yapacak. Çekişme davranış değişikliği. Tam kopyaya tek satırlık bir komut dosyası gerektirdiğine inanmaya devam ediyorum. - cfi
git clone --mirror git depolarını yedeklemek için çok iyi ^ ^ - TrinitronX


Bir şubeye, süslü "git checkout -b somebranch origin / somebranch" sözdizimini kullanmadan kolayca geçiş yapabilirsiniz. Sadece yapabilirsin:

git checkout somebranch

Git otomatik olarak doğru olanı yapacak:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git, aynı ada sahip bir şubenin tam olarak bir uzaktan kumandada olup olmadığını kontrol edecektir ve eğer varsa, bunun uzak bir şube olduğunu açıkça belirtmiş olmanız gibi izler. Git 1.8.2.1'in git-çıkış adam sayfasından:

<Dal> bulunamadıysa ancak içinde bir izleme dalı var   eşleşen bir ada sahip tam olarak bir uzaktan kumanda (<remote> olarak adlandırın)   eşittir

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



Yani, eğer şubenin adı varsa checkout uzak dalın ismine özdeş, "/" den sonra her şey, sonra git aynı isimde bir şube oluşturacak, "/", "takip" den sonra her şey uzak mı? Ve takip ederek, demek istediğimiz: git push, git pullvb. bu uzaktan kumandada yapılacak mı? Bu doğruysa, daha fazla bilgi ile cevabınızı genişletin, çünkü @Daniel ile katılıyorum, bu cevap daha fazla temsilcisi hak ediyor. - Gerard Roche
@BullfrogBlues, tüm sorularınızın cevabı evet gibi görünüyor (git v1.7.7.4 kullanıyorum). Bu davranışın daha iyi bilmesi gerektiğine katılıyorum. (Git'in bu sürümü için kılavuzda değil.) Aslında bu davranıştan hoşlanmıyorum, bir hata almayı ve söylemek zorundayım. git checkout --track origin/somebranch açıkça. - dubiousjim
@dubiousjim: Aslında, bu el kitabında. git-checkout (1) diyor ki: "Eğer <branch> bulunamazsa, ama bir eşleşme listesinde tam olarak bir uzak bir izleme var (buna <remote> olarak adlandırın), eşleşen bir adla eşleşir, 'git checkout -b <dalına eşdeğer olarak davran > --track <remote> / <branch> '"(Git V.1.8.1.1). - sleske
İhtiyacımız olan şey $ git pull * <remote> / * - Burada "*" bir joker karakterdir, bu yüzden henüz yerel sistemde olmayanlar da dahil olmak üzere tüm şubeleri çeker. Bu nasıl yapılır? Yerel sistemimize gelen kodu almak için her şubeyi gerçekten çekip / çekmemiz gerekiyor mu? - JosephK


ile ilgili olarak,

$ git ödeme -b deneysel kökeni / deneysel

kullanma

$ git checkout -t origin/experimental

veya daha ayrıntılı ama hatırlanması daha kolay

$ git checkout --track origin/experimental

Uzak bir depoyu izleme açısından daha iyi olabilir.


88
2017-07-27 06:10





Yaptığınız getirme tüm uzak şubeleri almalı, ancak onlar için yerel şubeler oluşturmayacaktır. Eğer gitk'i kullanırsanız, uzaktaki dalları "remotes / origin / dev" ya da benzer bir şey olarak görmelisiniz.

Uzak bir şubeye dayalı bir yerel şube oluşturmak için, aşağıdaki gibi bir şey yapın:

git checkout -b dev referansları / uzaktan kumandalar / kaynak / dev

Hangi gibi bir şey dönmelidir:

Şube dev uzak şube refs / remotes / origin / dev izlemek için kuruldu.
Yeni bir şube "dev" olarak değiştirildi

Şimdi, dev dalda olduğunuzda, "git çekme" yerel devinizi uzak dev dalıyla aynı noktaya güncelleyecektir. Tüm şubeleri getireceğine dikkat edin, ama sadece ağaçların üst kısmına çekiniz.


77
2017-09-15 22:52



Burada ref / remotlara ihtiyacınız yok. git checkout -b dev kökeni / dev iyi çalışacaktır. - emk
Bu her zaman çalışır: git checkout -b newlocaldev --track origin/dev. Yerel şubenin uzak olanla aynı ada sahip olmasını istiyorsanız ve uzak olanın zor bir adı yoksa, -b newlocaldev. Varsayılan ile branch.autosetupmerge yapılandırma ayarı ve adında yerel bir şube olmadığını varsayalım devBu iki komut aynı şeyi yapabilir: git checkout -b dev origin/dev ve sadece düz git checkout dev. En sonunda, git checkout origin/dev yeni bir şube oluşturmaz, ancak sizi ayrık HEAD durumuna sokar. - dubiousjim
Uzaktan kumanda artık yokken ne olur, ancak Git silinmiş olduğunu kabul etmek için çok mu aptaldır? Bu sizi güncellediğinizi varsayar ve git branch -a bir uzak şube olarak listelemeye devam ediyor. - jww
Bunu onlarca dal için mi yapıyoruz? - JosephK


"Git clone git: // location" yazdığınızda, tüm dallar ve etiketler getirilir.

Belirli bir uzak dalın üstünde çalışmak için, uzaktaki bir uzak olduğunu varsayarak:

git checkout -b branch origin/branchname

57
2017-09-15 22:47



Notunuz için teşekkür ederim "tüm şubeler ve etiketler getirilir". Cevabın yanlış olduğuna dair yorum yapacağım, ama sonra kontrol ettim ve buldum, sen haklısın. Yani bir şekilde, en kısa cevabı verdiniz - eğer klonladıysanız, zaten var. Güzel. Bir tane eklemeye çalışın: deneyin $ git branch -a Öğrenmek için, uzak şubeler zaten mevcut. - Jan Vlcinsky


Takma ad kullanın. Herhangi bir yerel Git tek-astarı olmasa da, kendiniz tanımlayabilirsiniz

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

ve sonra onu kullanın

git clone-branches

46
2018-05-15 11:02





Bu çok karmaşık değil, çok basit ve yalın ileri adımlar şu şekildedir;

git fetch origin Bu, tüm uzak şubeleri yerel bölgenize getirecektir.

git branch -a Bu size tüm uzak şubeleri gösterecektir.

git checkout --track origin/<branch you want to checkout>

İstenilen dalda olup olmadığınızı aşağıdaki komutla doğrulayın;

git branch

Çıktı böyle olacak;

*your current branch 
some branch2
some branch3 

Mevcut şubeyi gösteren * işaretine dikkat edin.


43
2017-12-26 10:19



Sağol suraj. Nedeni çok oylanmadığı için. Ve ans sorgulayıcı tarafından kabul edilmez. - Sam
"Git getirme kaynağı" yerel şubelere uzak şubelerden herhangi birini getirmedi - yoksa bir yere mi gizlenmişler? Yukarıdaki tüm cevapları okumak bana bir baş ağrısı verdi. "Git, tüm şubeleri yerel duruma getir" i arıyoruz. Bunu yapmak için bash-betiklerinden başka bir yol olmalı. - JosephK
"Git getirme kaynağını" çalıştırdıktan hemen sonra, terminalinizde bu gibi bir çıkış gösterecektir - "* [yeni şube] branch_name -> origin / branch_name", ancak "git dalı" çalıştırdığınızda size sadece yerelinizi gösterecektir. bunun yerine şubeleri görebilmeniz için tüm şubeleri görebilmeniz için "git branch -a" ve daha sonra uzak şubeye geçmek için "git checkout --track origin / <check-out yapmak istediğiniz şube>" yi çalıştırmanız gerekir. Bu yardımcı olur umarım. :-) - Sam
Suraj, çünkü soru, bir kerede el ile güncelleme yapmak için değil, "tüm uzak şubeleri klonlamak" idi. Görünen o ki, gerçek soruya bir cevap yok - çok fazla dalınız varsa, sadece bir sürü yazmayı yapmanın yolları. - JosephK
Benim için çalıştı. Sağol kanka !! - Jagdish N