Git - Нажатие кода на два пульта дистанционного управления

У меня есть два удаленных репозитория git. origin и github

Я нажимаю свою ветку devel на оба репозитория.

git push -u origin devel
git push -u github devel

Но тогда, когда я это делаю. git push Он будет только нажат на github.

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

Ответ 1

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

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

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

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

Итак, добавьте новый удаленный вызов 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

Вы видите, что добавленные нами pushurl сохранены. Теперь один git push all master переместит ветвь master на git://another/repo.git и git://original/repo.git.

Ответ 2

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

git config alias.pushall '!git push origin devel && git push github devel'

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