pull / push z wielu zdalnych lokalizacji

W skrócie: czy istnieje sposób, aby Git repo push to and pull from a list of remote repos (a nie pojedynczy "origin")?

Długi: Często mam sytuację, gdy rozwijam aplikację na wielu komputerach, z różnymi połączeniami-powiedzmy laptop podczas transportu, komputer "A", gdy jestem w określonym miejscu, a inny komputer" B", gdy jestem na innym. Ponadto laptop może mieć łączność tylko z "A" lub "B" , a czasami jedno i drugie.

Chciałbym, aby git zawsze "wyciągał" i "pchał" do wszystkich komputerów, z którymi może się obecnie połączyć, więc łatwiej jest przeskoczyć z jednej maszyny do drugiej i kontynuować płynną pracę.

 609
git
Author: SurvivalMachine, 2009-05-11

14 answers

Możesz skonfigurować wiele zdalnych repozytoriów za pomocą polecenia git remote:

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

Aby pobrać ze wszystkich skonfigurowanych pilotów i zaktualizować gałęzie śledzenia, ale nie połączyć się z głową, wykonaj:

git remote update

Jeśli nie jest obecnie podłączony do jednego z pilotów, zajmie to trochę czasu lub wyrzuci błąd i przejdzie do następnego. Będziesz musiał ręcznie scalić z pobranych repozytoriów lub wybrać cherry-pick, w zależności od tego, jak chcesz zorganizować zbieranie zmian.

Aby sprowadzić mistrza gałąź z alt i wciągnij ją do bieżącej głowy, zrób:

git pull alt master

Więc w rzeczywistości git pull jest prawie skrótem od git pull origin HEAD (w rzeczywistości wygląda w pliku konfiguracyjnym, aby to określić, ale masz pomysł).

Aby wysyłać aktualizacje, musisz to zrobić ręcznie dla każdego repo. Myślę, że push został zaprojektowany z myślą o obiegu pracy z centralnym repozytorium.

 418
Author: araqnid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 21:19:56

Wykonywanie tego ręcznie nie jest już konieczne , w nowoczesnych wersjach git! Zobacz też Malwina'S rozwiązanie, poniżej.

Tutaj:

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

Oryginalna odpowiedź:

To coś, czego używam od dłuższego czasu bez złych konsekwencji i zasugerował Linus Torvalds na liście dyskusyjnej git.

Rozwiązanie Araqnid jest właściwym rozwiązaniem do wprowadzenia kodu do twojego repozytorium… ale kiedy, podobnie jak ja, masz wiele równoważnych autorytatywnych strumieni upstream (niektóre z moich bardziej krytycznych projektów klonuję zarówno do prywatnego upstream, GitHub, jak i Codaset), może to być ból, aby wcisnąć zmiany do każdego z nich, każdego dnia.

W skrócie, git remote add wszystkie Twoje piloty osobno... a następnie git config -e i dodaj scalony pilot. Zakładając, że masz to repozytorium config:

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

... aby utworzyć merged-remote dla "Paws" i "Codaset", Mogę dodać po wszystkim te:

[remote "Origin"]
    url = [email protected]:Paws/Paws.o.git
    url = [email protected]:elliottcable/paws-o.git

Kiedy już to zrobię, kiedy git push Origin Master, będzie naciskać kolejno na Paws/Master i Codaset/Master, ułatwiając życie.

 713
Author: ELLIOTTCABLE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:48

Najnowsza wersja git (stan na październik 2012) pozwala ci to zrobić z linii poleceń:

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

Następnie git push naciśnie na user1@repo1, a następnie naciśnie na user2@repo2. Zostaw --push jeśli chcesz również być w stanie git pull od nich też.

 213
Author: Malvineous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-04 04:54:34

Dodałem te aliasy do mojego~/.bashrc:

alias pushall='for i in `git remote`; do git push $i; done;'
alias pullall='for i in `git remote`; do git pull $i; done;'
 26
Author: Nona Urbiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-25 03:06:25

Możesz dodać piloty za pomocą:

git remote add a urla
git remote add b urlb

Następnie zaktualizować wszystkie repos zrobić:

git remote update
 18
Author: FelipeC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-16 00:27:26

Oto mój przykład ze skryptem bash wewnątrz .gitconfig sekcja alias

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
 13
Author: troex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 01:20:52

Dodałem dwa oddzielne pushurl do zdalnego "origin" w .plik git congfig. Kiedy uruchamiam git push origin "branchName", to będzie przebiegać i naciskać na każdy adres url. Nie jestem pewien, czy jest łatwiejszy sposób, aby to osiągnąć, ale to działa dla mnie, aby wcisnąć do kodu źródłowego Github i wcisnąć do mojego.kod źródłowy visualStudio w tym samym czasie.

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"
 6
Author: dstineback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 17:11:56

Będziesz potrzebował skryptu, aby je zapętlić. Git doesn 't a provide a" push all."Teoretycznie można wykonać push w wielu wątkach, ale natywna metoda nie jest dostępna.

Fetch jest jeszcze bardziej skomplikowany i polecam zrobić to liniowo.

Myślę, że najlepszą odpowiedzią jest mieć raz Maszyny, że każdy robi push / pull do, jeśli to w ogóle możliwe.

 3
Author: Jeff Ferland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-11 18:19:59

Pozwoliłem sobie rozszerzyć odpowiedź z nona-urbiz; po prostu dodaj to do swojego ~/.bashrc:

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

Użycie:

git-pullall master

git-pushall master ## or
git-pushall

Jeśli nie podasz żadnego argumentu branch dla git-pullall, to ściąganie z niestandardowych pilotów nie powiedzie się; pozostawić to zachowanie tak, jak jest, ponieważ jest analogiczne do git.

 3
Author: hsk81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:30

Do aktualizacji pilotów (tj. przypadku pull), rzeczy stały się łatwiejsze.

Twierdzenie Linusa

Niestety, nie ma nawet sposobu, aby sfałszować to z Gitem alias.

W podanym wpisie na liście dyskusyjnej Git w odpowiedź elliottcable nie jest już prawdziwa.

git fetch nauczyłem się parametru --all gdzieś w przeszłości pozwalającego pobrać wszystkie piloty za jednym razem.

Jeśli nie wszystkie są wymagane, można użyć przełącznika --multiple w celu określenia wielu pilotów lub grupy.

 3
Author: eckes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:00

Dodaj alias do globalnego gitconfig (/home/user/.gitconfig) z poniższym poleceniem.

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

Po zatwierdzeniu kodu mówimy

Git push

Aby domyślnie wcisnąć do origin. Po powyższym aliasie możemy powiedzieć

Git pushall

I Kod zostanie zaktualizowany do wszystkich pilotów, w tym origin remote.

 1
Author: dhirajforyou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 11:03:04

Dodawanie pilota all staje się trochę żmudne, ponieważ musisz skonfigurować każdy komputer, którego używasz.

Również bash i git aliasy pod warunkiem, że wszystkie zakładają, że masz wypchnie do wszystkie piloty. (Ex: mam Widelec sshag, który utrzymuję na GitHubie i gitlab. Mam dodanego upstream remote, ale nie mam uprawnień, aby go wcisnąć.)

Oto git alias , który wypycha tylko do pilotów z adresem URL push, który zawiera @.

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

 0
Author: go2null,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 22:15:45

Chciałem pracować w VSO / TFS, a następnie publicznie wcisnąć GitHub, gdy będzie gotowy. Początkowe repo utworzone w prywatnym VSO. Kiedy przyszedł czas na dodanie do Githuba zrobiłem:

git remote add mygithubrepo https://github.com/jhealy/kinect2.git
git push -f mygithubrepo master
Zadziałało jak mistrz...

Aby sprawdzić stan zdrowia psychicznego, wydaj "git remote-v", aby wyświetlić listę repozytoriów powiązanych z projektem.

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)
Prosty sposób, zadziałał dla mnie... Mam nadzieję, że to komuś pomoże.
 0
Author: Joe Healy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 03:02:42

Dodawanie nowego pilota

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

git remote -vv

Pobieranie z wielu lokalizacji

git fetch --all

Push to locations

git push -u upstream/dev
 -2
Author: Dadaso Zanzane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-04 09:15:50