Git: Нажав на два репо в одной команде

Я хочу делать git push origin а также git push my_other_remote в той же строке. Возможный?

4 ответа

Решение

Вы можете получить тот же эффект, добавив дополнительный push-URL для вашего origin дистанционный пульт. Например, если URL-адреса ваших существующих пультов следующие:

$ git remote -v
origin  me@original:something.git (fetch)
origin  me@original:something.git (push)
my_other_remote git://somewhere/something.git (fetch)
my_other_remote git://somewhere/something.git (push)

Вы могли бы сделать:

 git remote set-url --add --push origin git://somewhere/something.git

Затем, git push origin подтолкнет в оба репозитория. Вы можете настроить новый пульт под названием both для этого, однако, чтобы избежать путаницы. Например:

 git remote add both me@original:something.git
 git remote set-url --add --push both me@original:something.git
 git remote set-url --add --push both git://somewhere/something.git

... затем:

 git push both

... будет пытаться протолкнуть оба хранилища.

Вы можете поместить следующее в .git/config файл:

[remote "both"]
    url = url/to/first/remote
    url = url/to/other/remote

Теперь вы можете нажать на оба URL, используя git push both,

Если вы также хотите извлечь их (полезно для синхронизации), вы можете добавить следующие строки в .git/config файл:

[remotes]
    both = origin, other

Теперь вы также можете запустить git fetch both,

Просто небольшое дополнение к уже предоставленным отличным ответам - если вы не хотите беспокоиться о добавлении "обоих" и просто хотите, чтобы все операции были автоматически перенесены в оба репозитория, просто добавьте свое второе репо в качестве другого URL-адреса под origin в конфигурации git.

[remote "origin"]
    url = someUrl.git
    url = secondUrl.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Теперь git push использует оба.

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

      git remote set-url --add --push origin git://original/repo.git
git remote set-url --add --push origin git://another/repo.git

Поэтому, когда вы нажимаете на источник, он будет нажимать на оба репозитория.

ОБНОВЛЕНИЕ 1: Git 1.8.0.1 и 1.8.1 (и, возможно, другие версии), похоже, имеют ошибку, из-за которой --add заменяет исходный URL-адрес при первом использовании, поэтому вам необходимо повторно добавить исходный URL-адрес, используя та же самая команда. Выполнение git remote -v должно показать текущие URL-адреса для каждого пульта.

ОБНОВЛЕНИЕ 2: Джунио С. Хамано, сопровождающий Git, объяснил, как это было спроектировано. Выполнение git remote set-url --add --push <remote_name> добавляет pushurl для данного пульта, который переопределяет URL-адрес по умолчанию для push-уведомлений. Однако вы можете добавить несколько pushurl для данного пульта, что затем позволит вам отправлять на несколько пультов, используя один git push. Вы можете проверить это поведение ниже:

      $ git clone git://original/repo.git
$ git remote -v
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.'
remote.origin.url=git://original/repo.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

Теперь, если вы хотите выполнить отправку в два или более репозитория с помощью одной команды, вы можете создать новый удаленный объект с именем all (как предложено @Adam Nelson в комментариях) или продолжать использовать источник, хотя последнее имя менее описательно для эта цель. Если вы все еще хотите использовать источник, пропустите следующий шаг и используйте источник вместо всех на всех остальных шагах.

Итак, давайте добавим новый удаленный объект с именем all, на который мы будем ссылаться позже при отправке в несколько репозиториев:

      $ git remote add all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)               <-- ADDED
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git            <-- ADDED
remote.all.fetch=+refs/heads/*:refs/remotes/all/* <-- ADDED

Затем добавим pushurl на удаленный all, указывающий на другой репозиторий:

      $ git remote set-url --add --push all git://another/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)                 <-- CHANGED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git         <-- ADDED

Здесь git remote -v показывает новый pushurl для push, поэтому, если вы выполните git push all master, он отправит ветку master только на git://another/repo.git. Это показывает, как pushurl переопределяет URL-адрес по умолчанию (remote.all.url).

Теперь давайте добавим еще один pushurl, указывающий на исходный репозиторий:

      $ git remote set-url --add --push all git://original/repo.git
$ git remote -v
all git://original/repo.git (fetch)
all git://another/repo.git (push)
all git://original/repo.git (push)                <-- ADDED
origin  git://original/repo.git (fetch)
origin  git://original/repo.git (push)
$ git config -l | grep '^remote\.all'
remote.all.url=git://original/repo.git
remote.all.fetch=+refs/heads/*:refs/remotes/all/*
remote.all.pushurl=git://another/repo.git
remote.all.pushurl=git://original/repo.git        <-- ADDED
You see both pushurls we added are kept. Now a single git push all master will push the master branch to both git://another/repo.git and git://original/repo.git.

ВАЖНОЕ ПРИМЕЧАНИЕ. Если ваши пульты имеют разные правила (хуки) для принятия/отклонения нажатия, один пульт может принять его, а другой нет. Поэтому, если вы хотите, чтобы у них была точно такая же история, вам нужно будет исправить свои коммиты локально, чтобы сделать их приемлемыми для обоих пультов, и снова нажать, или вы можете оказаться в ситуации, когда вы можете исправить это, только переписав историю (используя push -f), и это может вызвать проблемы у людей, которые уже вытащили ваши предыдущие изменения из репозитория.

Другие вопросы по тегам