Pull/push из нескольких удаленных мест

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

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

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

Ответ 1

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

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

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

git remote update

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

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

git pull alt master

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

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

Ответ 2

Выполнение этого вручную больше не требуется, с современными версиями git! Ниже приведено Malvineous.

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

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

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

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

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

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

... для создания объединенного-удаленного для "Paws" и "Codaset", я могу добавить следующее после всех из них:

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

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

Ответ 3

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

git remote set-url origin --push --add [email protected]
git remote set-url origin --push --add [email protected]
git remote -v

Затем git push перейдет к user1 @repo1, а затем к user2 @repo2.

Ответ 4

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

Ответ 5

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

git remote add a urla
git remote add b urlb

Затем обновить все репозитории:

git remote update

Ответ 6

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

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

Ответ 7

Я добавил два отдельных pushurl к удаленному "origin" в файле .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"

Ответ 8

Я взял на себя смелость расширить ответ от 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.

Ответ 9

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

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

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

Ответ 10

Для обновления пультов (т.е. случая pull) стало легче.

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

К сожалению, нет никакого способа подделать это с помощью gitпсевдоним.

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

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

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

Ответ 11

Я хотел работать в VSO/TFS, а затем публично нажать на GitHub, когда будет готов. Начальное репо создано в частном ВСО. Когда пришло время добавлять в GitHub, я сделал:

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

Работал как чемпион...

Для проверки работоспособности введите git remote -v, чтобы получить список репозиториев, связанных с проектом.

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)

Простой способ, работал для меня... Надеюсь, это кому-то поможет.

Ответ 12

добавьте псевдоним для глобального gitconfig (/home/user/.gitconfig) с помощью команды ниже.

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

Как только вы передадите код, мы скажем

мерзавец

подтолкнуть к происхождению по умолчанию. После псевдонима, мы можем сказать,

мерзкий толчок

и код будет обновлен для всех пультов, включая исходный пульт.

Ответ 13

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

Кроме того, все псевдонимы bash и git предполагают, что у вас есть push для всех пультов. (sshag: у меня есть форк sshag который я поддерживаю на GitHub и GitLab. У меня есть удаленный апстрим, но у меня нет разрешения на него.)

Вот псевдоним git отправляет только на удаленные устройства с помощью push-URL, который включает @.

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

Ответ 14

Можно ли использовать один "источник", а затем выбрать репозиторий для отправки файлов?

Допустим, у меня есть два хранилища: DEV и DEVQA.

Есть ли способ, которым я могу выбрать, какой я могу выбрать репозиторий для отправки файлов?

В этом примере, может ли SourceTree автоматически синхронизировать, что файлы были переданы в DEV, но они все еще не находятся в DEVQA?

Спасибо за помощь

Ответ 15

Добавление нового удаленного

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

git remote -vv

Получить выборку нескольких местоположений

git fetch --all

Нажмите на пункты

git push -u upstream/dev