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), и это может вызвать проблемы у людей, которые уже вытащили ваши предыдущие изменения из репозитория.