Я уверен, что есть ярлык для него, но я склонен использовать только основные команды.В любом случае настройте репозиторий для B
:
$ cd repo_B
$ git init --bare
$ git remote add upstream URL_FOR_REPO_A
$ git fetch upstream +master:refs/heads/x_master
$ git branch master x_master
При изменении вышестоящего репозитория эти изменения нужно перенести в пустой репозиторий 1 :
$ git fetch upstream +master:refs/heads/x_master
Это перезапишет 2 любые возможные изменения в x_master
, поэтому вам лучше оставить эту ветку в покое.:)
Вы захотите объединить восходящие изменения в x_master
в master
, когда / если A изменится.К сожалению, на этой стадии могут возникнуть конфликты, поэтому это должно быть сделано с помощью клона нашего открытого хранилища.Просто клонируйте репозиторий B (в локальное или удаленное местоположение) и объедините x_master
в master
, разрешите конфликты и вернитесь назад.
И последняя задача - продвижение разработки, выполненной в master
в хранилище А. Это можно сделать двумя способами.Во-первых, это непосредственное перемещение мастера B в хранилище A. Это можно сделать, выполнив:
$ git push upstream
в хранилище B. Альтернативой является более контролируемое слияние от master
до x_master
с использованием третьегорепозиторий:
$ git clone URL_FOR_REPO_A
$ cd repoDir
$ git remote add dev URL_FOR_REPO_B
$ git fetch dev
$ git branch --track master_b dev/master
$ git merge master_b
$ <resolve conflicts, if any>
$ git push origin master
Примечание 1
Для завершения вы можете настроить пульт дистанционного управления на выборку только этой ветви по умолчанию:
$ git configure branch.upstream.fetch +master:refs/heads/x_master
И с помощью --add
, вы можете даже добавить больше веток для извлечения:
$ git configure --add branch.upstream.fetch +branch_1_0:refs/heads/x_branch_1_0
Теперь выборка будет работать правильно без ссылок:
$ git fetch upstream
Примечание 2
Чтобы предотвратить толчки к master
из repo_B
, вы можете использовать ловушку на стороне сервера , например pre-receive
или update
.