birden çok uzak konumdan çekme / itme


743

Kısacası , git repo'yu uzak depolar listesine (tek bir "köken" yerine) itip çekmek için bir yol var mı?

Uzun: Farklı bağlantılara sahip birden fazla bilgisayarda bir uygulama geliştirirken genellikle bir durumum var - transit halindeyken bir dizüstü bilgisayar, belirli bir konumdayken "A" bilgisayar ve başka bir bilgisayar "B" deyin başka bir zaman. Ayrıca, dizüstü bilgisayarın yalnızca "A" veya "B" ve bazen her ikisiyle de bağlantısı olabilir.

Gitmek istediğim şey git için şu anda bağlanabildiği tüm bilgisayarlardan her zaman "çekmek" ve "itmek", bu yüzden bir makineden diğerine atlamak ve sorunsuz çalışmaya devam etmek daha kolay.


39
2016 itibariyle yeni ziyaretçiler için Not: birinci sınıf tarafından yaptırım Bunu yapmak için şu anda-doğru yolu gitözellikleri, dahildir malvineous 'ın altında cevap . Kabul edilen cevap yanlış.
ELLIOTTCABLE

@Zorzella: Bu konuda kabul edilen cevabı güncelleyebilir misin, şu anda olduğu gibi kafa karıştırıcı.
ntninja

Yanıtlar:


503

Şu git remotekomutla birden çok uzak depo yapılandırabilirsiniz :

git remote add alt alt-machine:/path/to/repo

Yapılandırılmış tüm uzaktan kumandalardan getirmek ve izleme dallarını güncellemek, ancak birleştirilmemek HEADiçin şunları yapın:

git remote update

Şu anda uzaktan kumandalardan birine bağlı değilse, zaman aşımına uğrar veya bir hata atar ve bir sonrakine geçer. Getirilen depolardan veya cherry-picktoplama değişikliklerini nasıl düzenlemek istediğinize bağlı olarak manuel olarak birleştirmeniz gerekir .

Ana dalı alttan almak ve geçerli kafanıza çekmek için şunları yapın:

git pull alt master

Yani aslında git pullneredeyse kısaydı git pull origin HEAD(aslında bunu belirlemek için config dosyasına bakar, ancak fikri anlarsınız).

Güncellemeleri zorlamak için bunu her bir repoya manuel olarak yapmalısınız.
Bence bir itme merkezi veri havuzu iş akışı düşünülerek tasarlandı.


yani "git remote add foo ssh: //foo.bar/baz" kısayol formunu oluşturuyor, ama yine de "git pull" ile döngü yapmam veya "git" ile döngü yapmam gerekiyor merge "(" git kaldır güncellemesinden "sonra buradaki sözdizimi nedir?) Bu kısayol adı" git push "için de çalışmaz mı? Yani "git push foo" vs (döngü)? Teşekkürler
Zorzella

8
"git pull" temel olarak "git fetch" ve ardından "git merge" olur. "git uzaktan güncelleme" sadece bir sürü "git fetch" çağrısı yapar. Yani geriye kalan "git merge" bitini yapmak. "Git merge origin / master" diyebilirsiniz ve orijinalin master sürümünü geçerli HEAD'inizde birleştirecektir. "git pull origin master" aynı şeyi yapar, ancak önce bir getirme yapar (ve git git güncellemesini zaten yaptıysanız, getirilecek daha fazla bir şey olmayacaktır, bu yüzden gereksizdir). Evet, "git push foo" diyebilirsiniz ve eşleşen tüm dalları "foo" adı verilen uzaktan kumandaya itecektir.
araqnid

IIUC çalışan bir depoya giremezsiniz (sonuçta uyumsuz / denenmemiş / istenmeyen değişiklikleri itiyor olabilirsiniz). Çıplak depolara girmeli ve sadece çektiğimizde güncellemeler almalıyız. Yani çözüm, her makinede bir çalışma ve çıplak bir depo gerektiriyor mu?
joeytwiddle

2
Görünüşe göre birkaç repos için tek bir itme yapabilirsiniz, daha fazla ayrıntı için bu cevabı kontrol edin stackoverflow.com/questions/14290113/…
manei_cc

797

Bunu manuel olarak yapmak artık modern sürümleriyle gerekli değildirgit ! Aşağıdaki Malvineous'un çözümüne bakın.

Burada çoğaltıldı:

git remote set-url origin --push --add <a remote>
git remote set-url origin --push --add <another remote>

Orijinal cevap:

Bu kötü sonuçlar olmadan bir süredir kullanıyorum ve git posta listesinde Linus Torvalds tarafından önerildi .

araqnid ‘ın çözüm kodunu getirmek için uygun biri haline , o senin depo ... ama benim gibi, birden eşdeğer yetkili upstreams olduğunda (ben de özel hem önünde, GitHub ve Codaset klonlanmış benim daha kritik projelerin bazıları tutmak) değişiklikleri her gün, her gün değiştirmek için bir acı olabilir.

Uzun lafın kısası, git remote addtüm uzaktan kumandalarınız ayrı ayrı… ve sonra git config -ebirleştirilmiş bir uzaktan kumanda ekleyin. Bu depoya sahip olduğunuzu varsayarsak config:

[remote "GitHub"]
    url = git@github.com:elliottcable/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/GitHub/*
[branch "Master"]
    remote = GitHub
    merge = refs/heads/Master
[remote "Codaset"]
    url = git@codaset.com:elliottcable/paws-o.git
    fetch = +refs/heads/*:refs/remotes/Codaset/*
[remote "Paws"]
    url = git@github.com:Paws/Paws.o.git
    fetch = +refs/heads/*:refs/remotes/Paws/*

… İçin birleştirilmiş ‐ uzaktan kumanda oluşturmak için "Paws"ve "Codaset"bunlardan sonra aşağıdakileri ekleyebilirim:

[remote "Origin"]
    url = git@github.com:Paws/Paws.o.git
    url = git@codaset.com:elliottcable/paws-o.git

Ben ne zaman bu, yaptıktan sonra git push Origin Master, her iki itecektir Paws/Masterve Codaset/Masterbiraz kolaylık sağlamaktadır sırayla.


104
git config -e.git/configdosyayı tercih ettiğiniz düzenleyicide açar .
Richard

3
Her ihtimale karşı. 2 url'li bir uzaktan kumandanın bulunmasının hala işi 1.7.12.4'te yaptığının doğrulanması. Teşekkürler.
foobar

26
Ben biraz daha temiz anlambilim vermek için "kökeni" uzaktan "all" adını verdim
ErichBSchulz 17:13

1
@ JamesWomack aşağıdaki @ Malvineous'un cevabına bakınız. git'S komut satırı bunu doğal olarak desteklediği için şimdi “daha ​​doğru” git remote set-url ... --add.
ELLIOTTCABLE

1
[branch "Master"]Set altında remote = Originve git pullher iki uzaktan kumanda kullanacağız.
Bengt

264

Git 1.8'den (Ekim 2012) beri bunu komut satırından yapabilirsiniz:

git remote set-url origin --push --add user1@repo1
git remote set-url origin --push --add user2@repo2
git remote -v

Ardından git pushuser1 @ repo1'e, ardından user2 @ repo2'ye itin.


19
Bu çözüme karşı şiddetle tavsiye ediyorum. Şirketimizde kullandık ve kancaların bir depoda başarısız olmasıyla, diğerinde değilken ciddi bir sorunla karşılaştık. Değişiklikler daha sonra sadece bir depoda mevcuttu.
Michael Schmeißer

4
@ MichaelSchmeißer: Muhtemelen iterken hata mesajlarını görebiliyorsunuz, sorunu düzeltin, sonra her şeyi temiz bir duruma getirmek için tekrar itin?
Malvineous

7
Sorun, reddedilen itmenin düzeltilmesinin, daha önce diğer repoya itilmiş olan taahhütlerin değiştirilmesini içermesidir. Yani, eğer bir kişi sabitlendikleri zaman bu taahhütlere dayanarak çalışmışsa, işler gerçekten kötü olur, ki bu bizim ofisimizdeki durumdur.
Michael Schmeißer

9
Ah evet, bu biraz zor olabilir. Ancak bana göre kancaların yeniden tasarlanması gerekiyor. Başarısız bir itme git'i normal olarak bozmaz, bu nedenle yeni bir hata noktası getirmek (bu da şık bir git özelliğini kullanmanızı da önler) muhtemelen en iyi çözüm değildir. Elbette bunu gereksinimlerinizin ne olduğunu bilmeden söylüyorum ...
Malvineous

3
Hayır. Sorumu yazdığımdan beri, diğer web gönderilerini okudum ve sonra bu şeyi test ettim. Diğer yazıları okuduktan sonra, sadece ilk satırın kullanıldığı şüphesi var. Bunu sadece test ettim: gerçekten, sadece ilk satırdaki URL tarafından denetleniyor git fetch. (Bu göz önüne alındığında, amacının git remote set-url --addonsuz olabileceğini anlamıyorum --push.)
imz - Ivan Zakharyaschev

34

Bu takma adları ~ / .bashrc'ye ekledim:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'

6
Bu harika! Git takma adı git config alias.pushall '!for i in ; do git push $i; done;'
buldum

Takma ad çözümünü yeni bir uzaktan kumanda oluşturmayı tercih ediyorum. Ayrıca bkz. Stackoverflow.com/questions/41372919/…
donquixote

1
Küçük önerilen tweak:alias pushall='for i in `git remote`; do echo "Pushing to " $i; git push $i; done;'
Scott C Wilson

25

Şunlarla uzaktan kumanda ekleyebilirsiniz:

git remote add a urla
git remote add b urlb

Sonra tüm depoları güncellemek için şunları yapın:

git remote update

15

İşte .gitconfigtakma ad bölümünde bash betiği olan örneğim

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"

7

.Git congfig dosyasındaki uzak "orijine" iki ayrı pushurl ekledim. Ben çalıştırdığınızda git push origin "branchName"Sonra içinden çalıştırabilir ve her bir URL'ye itecektir. Bunu yapmanın daha kolay bir yolu olup olmadığından emin değilim, ancak bu benim için Github kaynak koduna ve My.visualStudio kaynak koduna aynı anda itmek için çalışıyor.

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"

4

Cevabı non-urbiz'den genişletme özgürlüğünü aldım; bunu ~ / .bashrc'nize ekleyin:

git-pullall () { for RMT in $(git remote); do git pull -v $RMT $1; done; }    
alias git-pullall=git-pullall

git-pushall () { for RMT in $(git remote); do git push -v $RMT $1; done; }
alias git-pushall=git-pushall

Kullanımı:

git-pullall master

git-pushall master ## or
git-pushall

Git-pullall için herhangi bir şube argümanı sağlamazsanız, varsayılan olmayan uzaktan kumandalardan çekme başarısız olur; git'e benzer olduğu için bu davranışı olduğu gibi bıraktı.


3

Bunlar arasında dolaşmak için bir komut dosyasına ihtiyacınız olacak. Git bir "hepsini it" sağlamıyor. Teorik olarak birden çok iş parçacığında bir itme yapabilirsiniz, ancak yerel bir yöntem kullanılamaz.

Getirme daha karmaşıktır ve bunu doğrusal olarak yapmanızı tavsiye ederim.

Bence en iyi cevabınız, eğer mümkünse, herkesin bir itme / çekme yaptığı bir makineye sahip olmaktır.


2
Sorun, açıkladığım gibi, her zaman kullanılabilir merkezi bir kutu olmamasıdır. Döngüsel bir bash betiği
yazmam

2
Dağıtıldığında, herkesin müsait olmadığını ya da zorlanmak istediğini varsayar. Aynı zamanda, farklı eyaletlerde bulunan farklı depolar ve başkalarının aynı anda üzerinde çalıştıkları varsayımı ile de ilgilidir. Bir depo kümesinden itip çektiğiniz sıra, farklı depoların durumunu etkiler ve hepsinin gerçekten senkronize edilmesi için birden fazla geçiş yapmanız gerekir. Bu yüzden "hepsini çekin / itin" yoktur. Sonra çatışmalar var ...;)
Jeff Ferland

3

Uzaktan kumandaları güncellemek için (örn. pullDurum), işler daha kolay hale geldi.

Linus'un açıklaması

Ne yazık ki, bunu bir git takma adıyla taklit etmenin bir yolu bile yok.

Referans gösterilen girişte Git posta listesine içinde en elliottcable cevap artık doğrudur.

git fetch--allParametreyi geçmişte bir yerde tüm uzaktan kumandaları tek seferde almaya izin vererek öğrendim .

Hepsi istenmezse, --multipleanahtar birden fazla uzaktan kumanda veya grup belirtmek için kullanılabilir.


3

VSO / TFS'de çalışmak istedim, sonra hazır olduğunda herkese açık olarak GitHub'a gönderdim. Özel VSO'da ilk repo yaratıldı. GitHub'a ekleme zamanı geldiğinde yaptım:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master

Şampiyon gibi çalıştı ...

Bir sağlık kontrolü için, bir projeyle ilişkili depoları listelemek üzere "git remote -v" komutunu verin.

C:\dev\kinect\vso-repo-k2work\FaceNSkinWPF>git remote -v
githubrepo      https://github.com/jhealy/kinect2.git (fetch)
githubrepo      https://github.com/jhealy/kinect2.git (push)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (fetch)
origin  https://devfish.visualstudio.com/DefaultCollection/_git/Kinect2Work (push)

Basit bir şekilde, benim için çalıştı ... Umarım bu birine yardımcı olur.


4
git push -fSebepsiz koşmak , örneğin git pushbir kişinin ne yaptığını bilmemek veya tam olarak bilmek, potansiyel olarak zararlı bir fikirdir. Bu da soruyu cevaplamıyor, ancak ikinci bir uzaktan kumandanın nasıl ekleneceği.
Karl Richter

2

aşağıdaki komutla global gitconfig'e (/home/user/.gitconfig) bir takma ad ekleyin.

git config --global alias.pushall '!f(){ for var in $(git remote show); do echo "pushing to $var"; git push $var; done; }; f'

Bir kez kod verdiğinizde,

git push

varsayılan olarak başlangıç ​​noktasına itmek için. Yukarıdaki takma addan sonra,

git pushall

ve kod, kaynak uzaktan kumanda dahil tüm uzaktan kumandalara güncellenecektir.


1

allUzaktan kumandayı eklemek, kullandığınız her makineye kurulum yapmanız gerektiğinden biraz sıkıcı olur.

Ayrıca, sağlanan bashve git diğer adlar , tüm uzaktan kumandalara zorlayacağınızı varsayar . (Örn: sshagGitHub ve GitLab'da kullandığım bir çatalım var. Yukarı akış uzaktan kumandayı ekledim, ancak itme iznim yok.)

Aşağıda, yalnızca içeren bir push URL'si olan uzaktan kumandalara iten bir git takma ad verilmiştir @.

psall    = "!f() { \
    for R in $(git remote -v | awk '/@.*push/ { print $1 }'); do \
    git push $R $1; \
    done \
    }; f"

-3

Yeni uzaktan kumanda ekleme

git remote add upstream https://github.com/example-org/example-repo.git

git remote -vv

Birden çok konum getirme

git fetch --all

Konumlara aktar

git push -u upstream/dev
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.