Страницы

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

пятница, 13 декабря 2019 г.

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

#git #git_push #git_remote


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

А как это сделать одной командой git что-то-там? без написания скрипта или функции
или псевдонима (alias-а).
    


Ответы

Ответ 1



для каждого удалённого репозитория можно задать 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-репозиториях. ответ основан на информации из этого и этого ответов.

Ответ 2



Если вкратце. // Добавляем git remote add "all" git@github.com:fudeglan/gigalab.uz.git git remote set-url --add --push "all" git@github.com:fudeglan/gigalab.uz.git git remote set-url --add --push "all" git@bitbucket.org:fudeglan/gigalab.uz.git git remote set-url --add --push "all" git@gitlab.com:fudeglan/gigalab.uz.git // Отправляем git push all .git/config примерно будет таким [remote "all"] url = git@github.com:fudeglan/gigalab.uz.git fetch = +refs/heads/*:refs/remotes/all/* pushurl = git@github.com:fudeglan/gigalab.uz.git pushurl = git@bitbucket.org:fudeglan/gigalab.uz.git pushurl = git@gitlab.com:fudeglan/gigalab.uz.git

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

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