тянуть / толкать из нескольких удаленных мест - PullRequest
681 голосов
/ 11 мая 2009

Коротко: есть ли способ заставить git-репо выдвигать и извлекать из списка удаленных репо (а не из одного "источника")?

Длинное: У меня часто бывает ситуация, когда я разрабатываю приложение на нескольких компьютерах с разной связью - скажем, ноутбук во время транспортировки, компьютер "А", когда я нахожусь в определенное место, а другой компьютер "B", а на другом. Кроме того, ноутбук может иметь связь только с «A» или «B», а иногда и с обоими.

Я хотел бы, чтобы git всегда «извлекал» и «давил» на все компьютеры, к которым он может подключиться в настоящее время, чтобы легче было переходить с одной машины на другую и продолжать бесперебойную работу.

Ответы [ 14 ]

759 голосов
/ 07 июля 2010

Делать это вручную больше не нужно , с современными версиями git! См. Решение Malvineous , ниже.

Воспроизводится здесь:

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

Оригинальный ответ:

Это то, чем я пользуюсь долгое время без каких-либо последствий, и предложено Линусом Торвальдсом в списке рассылки git .

araqnid * Решение 1021 * является подходящим для внесения кода в ваше хранилище ... но когда у вас, как и у меня, есть несколько эквивалентных авторитетных апстримов (я держу некоторые из своих более критических проекты, клонированные как в частный апстрим (GitHub, так и в Codaset), может быть болезненно вносить изменения в каждый из них, каждый день.

Короче говоря, git remote add все ваши пульты в отдельности ... а затем git config -e и добавьте объединенный пульт. Если у вас есть этот репозиторий 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/*

… чтобы создать объединенный пульт для "Paws" и "Codaset", я могу добавить следующее после всех этих:

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

Как только я это сделаю, когда я git push Origin Master, он будет последовательно нажимать на Paws/Master и Codaset/Master, делая жизнь немного легче.

460 голосов
/ 12 мая 2009

Вы можете настроить несколько удаленных репозиториев с помощью команды git remote:

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

Чтобы получить данные со всех настроенных удаленных устройств и обновить ветви отслеживания, но не объединять их в HEAD, выполните:

git remote update

Если в данный момент он не подключен к одному из пультов, потребуется время или выдаст ошибку, и перейдем к следующему. Вам нужно будет выполнить слияние вручную из выбранных репозиториев или вишневого пика в зависимости от того, как вы хотите организовать сбор изменений.

Чтобы получить ветку master из alt и вставить ее в свою текущую голову, выполните:

git pull alt master

Таким образом, на самом деле git pull - это почти сокращение для git pull origin HEAD (на самом деле это выглядит в файле конфигурации, чтобы определить это, но вы поняли)

Для отправки обновлений вы должны сделать это для каждого репо вручную. Я думаю, что push был разработан с учетом рабочего процесса с центральным хранилищем.

244 голосов
/ 09 октября 2012

Начиная с git 1.8 (октябрь 2012 г.), вы можете сделать это из командной строки:

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

Затем git push будет нажимать на user1 @ repo1, затем нажимать на user2 @ repo2. Оставьте --push, если вы также хотите иметь возможность git pull из них.

29 голосов
/ 25 декабря 2010

Я добавил эти псевдонимы в мой ~ / .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;'
21 голосов
/ 16 мая 2009

Вы можете добавить пульты с помощью:

git remote add a urla
git remote add b urlb

Затем для обновления всех репозиториев выполните:

git remote update
14 голосов
/ 30 ноября 2012

Вот мой пример со скриптом bash внутри .gitconfig раздела псевдонимов

[alias]
        pushall = "!f(){ for i in `git remote`; do git push $i; done; };f"
7 голосов
/ 01 июня 2017

Я добавил два отдельных pushurl к удаленному «источнику» в файле .git congfig. Когда я запускаю git push origin "branchName", тогда он будет проходить и нажимать на каждый URL. Не уверен, что есть более простой способ сделать это, но я работаю над тем, чтобы перейти к исходному коду Github и одновременно к исходному коду My.visualStudio.

[remote "origin"]
  url = "Main Repo URL"
  fetch = +refs/heads/*:refs/remotes/origin/*
  pushurl = "repo1 URL"
  pushurl = "reop2 URl"
3 голосов
/ 21 ноября 2013

Для обновления пультов (т. Е. Чехол pull) все стало проще.

Заявление Линуса

К сожалению, нет даже способа подделать это с мерзавцем псевдоним.

в ссылочной записи в списке рассылки Git в ответ elliottcable больше не соответствует действительности.

git fetch узнал параметр --all где-то в прошлом, позволяя получить все пульты за один раз.

Если запрашиваются не все, можно использовать переключатель --multiple, чтобы указать несколько пультов или группу.

3 голосов
/ 17 апреля 2012

Я позволил себе расширить ответ от nona-urbiz; просто добавьте это в ваш ~ / .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

Использование:

git-pullall master

git-pushall master ## or
git-pushall

Если вы не предоставите какой-либо аргумент ответвления для git-pullall, то извлечение из удаленных по умолчанию пультов завершится неудачей; оставил это поведение как есть, так как оно аналогично git.

3 голосов
/ 11 мая 2009

Вам понадобится скрипт для их просмотра. Git не обеспечивает "толкать всех". Теоретически вы можете выполнить push в нескольких потоках, но собственный метод недоступен.

Выборка еще сложнее, и я бы рекомендовал делать это линейно.

Я думаю, что ваш лучший ответ - это когда-то иметь машину, на которую все будут толкать / тянуть, если это вообще возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...