Tüm dalları çekmek ve itmek için git'i ayarlayın


615

Yeni oluşturulanlar da dahil olmak üzere varsayılan olarak tüm dalları itmek ve çekmek istiyorum.

Bunun için tanımlayabileceğim bir ayar var mı?

Aksi takdirde, yerel olarak yeni bir şube eklediğimde ve sunucudan çekmek istediğimde, bunu yapmanın en basit yolu nedir?

Aynı ada sahip yeni bir şube oluşturdum ve çekmeye çalıştım ama işe yaramıyor. Benden şubenin tüm uzak yapılandırmasını ister. Nasıl ayarlayabilirim.


4
"ve çekmeye çalıştı ama çalışmıyor". Ayrıntılar lütfen. Hangi komutu kullanmaya çalıştığınızı bize gösterin.
Jakub Narębski

Yanıtlar:


1297

En basit yol:

git push --all origin

Bu, etiketleri ve dalları zorlar.


10
SO ve diğer yerlerde bulduğum düzinelerce cevap arasında, bu, yapılandırmaya dokunmadan yeni oluşturulmuş bir yerel şubeyi zorlamanın en basit yoludur. Teşekkürler!
András Szepesházi

174
Ve bir -ukez eklerseniz , örneğin git push --all origin -u, izleme ayarlanır ve bundan sonra kullanabilirsiniz git push.
Alec

23
Git sürüm 1.7.12.3 git push --tags originiçin tüm etiketleri itmek için kullanmak zorunda kaldı .
thisgeek

17
Ayrıca "--all" yerine "--mirror" a bakın bu itme daha fazla şey
Loda

21
UYARI: Temizlemediğiniz bir sürü YEREL dalınız varsa (özellikler, düzeltmeler) - veya düzgün bir şekilde temizlemediyseniz (ben), bu uzaktan kumandanızı sular altında bırakacaktır. Lanet olsun. Ve biz sadece bir budama yaptık. Yerel halkın neden bu kadar çok şubesi kaldığından emin değilim.
Jack

147

Modern git ile her zaman tüm dalları alırsınız (uzaktan izleme dalları olarak refs/remotes/origin/*ad alanına, git branch -rveya ile görünür git remote show origin).

Varsayılan olarak ( push.defaultconfig değişkeninin belgelerine bakın ) eşleşen dalları itersiniz , yani git push origin branchgit'in her zaman açık olması için yapmanız gerekir git push.

Her zaman tüm dalları itmek istiyorsanız, push refspec'i ayarlayabilirsiniz. Uzaktan kumandanın adlandırıldığını varsayarsak, git configorigin kullanabilirsiniz :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

veya .git/configaşağıdakine benzer bir şeye sahip olmak için dosyayı doğrudan düzenleyin :

[uzak "başlangıç ​​noktası"]
        url = kullanici@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / uzaktan kumandalar / orijin / *
        fetch = + refs / tags / *: refs / tags / *
        push = + refs / kafalar / *: refs / kafalar / *
        push = + refs / tags / *: refs / tags / *

3
@Merc: git push --all originbir kez tüm dalları ve etiketleri yayınlamak için iyidir, ancak mevcut 'eşleşen' semantik sürümü varsayılana kadar yeni şube veya etiket eklemediğiniz sürece daha sonra tüm dalları iteceğiniz anlamına gelir ... Ayar için "itme [...] varsayılan olarak tüm dallar" yazıldığı gibi.
Jakub Narębski

Git'i bu şekilde yeniden yapılandırmanın yolunu eklemek için cevabı geliştirebilirsiniz. Bu, basit modu ayarlayan kullanıcılar için kullanışlıdır.
Dereckson

3
Bu git 2.0'dan beri değişti. Varsayılana basma basittir, artık eşleşmiyor.
mike

Bunu denedim ve itme konusunda bir hata aldım: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Not: Git 2.0 kullanıyorum. Hala bunu nasıl düzelteceğimi düşünüyorum.)
Brian Lacy

2
Şimdi varsayılan değeri push.defaultolan simple.
hasanghaforian

32

Push özelliklerine + eklemek muhtemelen kötü bir fikirdir, çünkü git -f olmadan bile hızlı bir şekilde ileriye doğru olmayan bir itme yapacak ve uzak sunucu bunları kabul edecek şekilde ayarlanmışsa geçmişi kaybedebilirsiniz.

Sadece şunu deneyin:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Ayrıca, --globalbunu tüm depolarınız için genel varsayılan yapmak için her birine seçenek ekleyebilirsiniz .
Eter

Yaparken + 'nın git tarafından otomatik olarak eklenmesi talihsiz bir durumdur git remote add.
Eter

26

Tüm şubeleri yeni depoya taşımak için aşağıdaki komutları kullanmıştım.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

NOT : Ben Atlassian bir repo klonlama sırasında ikinci son (yani itme ustası önce) komutunu kullanmak zorunda Stash AWS için CodeCommit (boş repo). Nedeni emin değilim, ama ( git push new-origin --mirror) ittikten sonra varsayılan şube daha başka bir dalı atıfta idi master.


1
Bir repoyu başka bir ana bilgisayara taşımak için mükemmeldir. Teşekkür ederim!
Pelmered

2
Bu gerçekten sadece kullanışlı bir yöntemdir. Kullanım git push new_origin --allsadece new_origin için menşe tüm dallarını geçerli yerel şubesi itin.
yanzi1225627

Bunun --barenormal bir depodan biraz farklı bir havuz oluşturduğuna dikkat çekerek , .gitdosyalarınıza değil sadece dosyalara sahiptir. İçinde iş yapmayacaksanız, yeterince mükemmel. Bkz. --bareVe --mirror git-scm.com/docs/git-clone .
20mm

Her ne kadar gerçek kaynak koduna değil sadece .git dosyalarına sahip olsa da, uzaktan güncelleme yaparsanız, başlangıç ​​noktasından hedefe her şeyi yeniden getirir.
SanthoshM

Bu bir cankurtaran! Bu "ayna öncesi master" yöntemi, Bitbucket'in hedef olması ve "master" dışında farklı bir şubeye inanmasıyla ilgili sorun düzeltildi.
Toddius Zho

12

Şubeleri eski bir repodan yeni bir repoya taşıyorsanız ve tüm eski repo şubelerini yerel olarak İÇERMİYORSANIZ, önce bunları izlemeniz gerekir.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Ardından yeni uzak deponuzu ekleyin:

git remote add bb <path-to-new-repo>

Sonra bu komutu kullanarak hepsini itebilirsiniz:

git push -u bb --all

Veya bir kez yapmıyorsanız veya yalnızca yerel dalları taşımak istiyorsanız, burada diğer yanıtlarda belirtilen git config komutlarını kullanarak repo'yu yapılandırabilirsiniz.

Önemli olan, diğer yanıtlar sadece tüm YEREL şubeleri zorlamaktadır. Şubeler yalnızca alternatif bir UZAKTAN depoda mevcutsa, önce onları izlemeden hareket etmezler. Burada sunulan for döngüsü buna yardımcı olacaktır.


BTW, burada "orijin" yerine "bb" kullanıyorum çünkü orijinal / eski deponuzun "origin" olarak adlandırıldığını ve muhtemelen bu etikete bağlı olduğunu varsayıyorum. "bb", orijinal depomu taşıdığım Bitbucket içindir, ancak isterseniz "neworigin" gibi daha uygulanabilir bir şey diyebilirsiniz.
Lance Cleveland

2
Bu benim için işe yaramadı. Tüm uzak şubelerin aynı yerel şubeyi takip
etmesiyle sona erdi

2
AFAIK bu @jhsowter yorumuna göre çalışmamalıdır. yeni klonlanmış bir repodaki uzak bir dalı izlemem için doğru komut, git branch --track reponame origin/reponameaksi takdirde mevcut yerel daldaki tüm uzak dalları izleyeceksiniz
Pioneer Skies

Repo toplama snippet'ini git branch -r | grep -v '\->' | sed 's/ origin\///', yalnızca uzak dal adını veren değiştirdim.
Paul Hicks

6

Kullanılmayan tüm dalları görmek için şunu git branch -açalıştırmalısınız:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Şimdi tüm dalları görebilirsiniz:

git branch

Tüm dalları itmek için deneyin:

git push --all

1
λ git fetch --all kökenli ölümcül: fetch
all

deniyor git fetch --allmusun
tokhi

4

Tüm şubeleri eskisinden yeni bir repoya taşıyorsanız, yerel repoda, yeni repoya gitmeden önce her bir şubenin mevcut orijin dallarına takibini ayarlamanız gerekir, aksi takdirde tüm orijin şubeleriniz görünmez yeni köken. Bunu her dalı izleyerek veya kontrol ederek manuel olarak yapın veya bir astarı kullanın:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Bu tek satırlık komut, bu sayfadaki diğer cevaplardaki sürümlerine dayanır, ancak muhtemelen daha iyidir çünkü:

  1. bu sayfadaki bu komutun --track için yalnızca bir parametre sağlayan bazı eski varyantlarının aksine, şube izlemeyi doğru şekilde kurar ve böylece her şube izleme yöneticisini bitirir - iyi değil
  2. yerel şubeleri şahsen istemediğim “orijin /” öneki olmadan adlandırır - ve bir şubeye normal olarak ödeme yaptığınızda olanlarla tutarlıdır.
  3. zaten gerçekleştiği için izleme yöneticisini atlıyor
  4. aslında hiçbir şey ödeme yapmaz bu nedenle hızlı
  5. git şubesinin çıkışında -> tökezlemesini önler

Daha sonra, orijinleri değiştiriyorsanız, eski orijine olan bağlantıyı değiştirin ve yeni bir uzaktan kumandaya yönlendirin. Önce yeni uzaktan kumandayı, bitbucket / github GUI kullanarak oluşturduğunuzdan emin olun, ancak herhangi bir dosya eklemeyin, aksi takdirde birleştirme sorunu olacaktır. Örneğin

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Şimdi itin. Etiketleri de itmek için ikinci komutun gerekli olduğunu unutmayın:

git push -u --all origin
git push --tags origin

0

originYapılandırmada sabit kodlama yapılmadan çözüm

Global gitconfig'inizde aşağıdakileri kullanın

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Bu, tüm dalları ve tüm etiketleri iter

originYapılandırmada neden sabit kod ETMEMELİSİNİZ?

Sabit kodunuz varsa:

  1. originTüm depolarda uzaktan kumanda olarak sonlandırırsınız . Yani kaynak ekleyemezsiniz, ancak kullanmanız gerekir set-url.
  2. Bir araç farklı bir ada sahip bir uzaktan kumanda oluşturursa, tüm yapılandırma uygulanmaz. Sonra uzaktan kumandayı yeniden adlandırmanız gerekir, ancak yeniden adlandırmayacaktır çünkü originzaten var (1. noktadan itibaren)

Getirme zaten modern git tarafından halledilir

Jakub Narębski'nin cevabına göre:

Modern git ile her zaman tüm dalları alırsınız (uzaktan izleme dalları olarak refs / uzaktan kumandalar / origin / * ad alanına

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.