В своём локальном репозитории можно подключить несколько удалённых репозиториев (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-репозиториях.
ответ основан на информации из этого и этого ответов.
Комментариев нет:
Отправить комментарий