Страницы

Поиск по вопросам

пятница, 2 ноября 2018 г.

Отправить изменения в несколько репозиториев одной командой push

В своём локальном репозитории можно подключить несколько удалённых репозиториев (git remote add ...) и отправлять в них изменения командой git push имя-репозитория имя-ветки — по одной команде на каждый репозиторий.
А как это сделать одной командой git что-то-там? без написания скрипта или функции или псевдонима (alias-а).


Ответ

для каждого удалённого репозитория можно задать pushurl, т.е., url, по которому будут отправляться изменения по команде push
этот pushurl, кстати, может и не совпадать с url данного репозитория. вот такой фокус: делаете push, вроде бы, в репозиторий на bitbucket-е, а изменения идут на github
более того: таких pushurl-ов может быть больше одного. и изменения одной командой отправятся сразу по нескольким url-ам.
добавляется pushurl с помощью команды примерно такого содержания:
$ git remote set-url --add --push имя-репозитория url-репозитория

от теории к практике.
создадим три (чтоб наверняка) bare-репозитория:
$ for i in 1 2 3; do git init --bare repo$i; done Initialized empty Git repository in ./repo1/ Initialized empty Git repository in ./repo2/ Initialized empty Git repository in ./repo3/
и сделаем клон первого из них:
$ git clone repo1 work Cloning into 'work'... warning: You appear to have cloned an empty repository. done. $ cd work
посмотрим умолчальную конфигурацию remote-ов:
$ git config --get-regexp "^remote" remote.origin.url ../repo1 remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
а теперь добавим pushurl-ы для всех созданных bare-репозиториев, не забыв и про сам исходный репозиторий (../repo1):
$ for i in 1 2 3; do git remote set-url --add --push origin ../repo$i; done $ git config --get-regexp "^remote" remote.origin.url ../repo1 remote.origin.fetch +refs/heads/*:refs/remotes/origin/* remote.origin.pushurl ../repo1 remote.origin.pushurl ../repo2 remote.origin.pushurl ../repo3
как видно, pushurl-ы благополучно добавились.
создаём коммит и отправляем его командой push
$ date > file $ git add file $ git commit -m 1 [master (root-commit) 2d68407] 1 1 file changed, 1 insertion(+) create mode 100644 file $ git push Counting objects: 3, done. Writing objects: 100% (3/3), 228 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo1 * [new branch] master -> master Counting objects: 3, done. Writing objects: 100% (3/3), 228 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo2 * [new branch] master -> master Counting objects: 3, done. Writing objects: 100% (3/3), 228 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo3 * [new branch] master -> master
вуаля! коммит отправился во все три bare-репозитория одной командой!
а как насчёт других веток?
создадим ещё одну ветку (new), добавим в неё коммит и отправим изменения:
$ git checkout -b new Switched to a new branch 'new' $ date >> file $ git commit -am 2 [new c82bfe5] 2 1 file changed, 1 insertion(+) $ git push -u origin new Counting objects: 3, done. Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo1 * [new branch] new -> new Branch new set up to track remote branch new from origin. Counting objects: 3, done. Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo2 * [new branch] new -> new Branch new set up to track remote branch new from origin. Counting objects: 3, done. Writing objects: 100% (3/3), 264 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To ../repo3 * [new branch] new -> new Branch new set up to track remote branch new from origin.
эта «магия» работает и с новыми ветками! коммит отправился в ветки new во всех трёх bare-репозиториях.

ответ основан на информации из этого и этого ответов.

Комментариев нет:

Отправить комментарий