Как вкладывать репозитории git; получить и объединить

Итак, у меня есть два репозитория git. Первый - это наша структура (представьте абстракцию db, функции), а затем еще один репозиторий git для нашего нового проекта.

Я хочу включить репозиторий git фреймворка в проект git, и, согласно справке GitHub, это должно сработать:

 cd /project
 git remote add framework git://github.com/username/Framework.git
 git fetch framework
 git merge framework/master

Проблема в том, что когда я выполняю слияние, он переносит все файлы из фреймворка и просто выгружает их в корень проекта. Вместо этого, как мы можем объединить файлы фреймворка в дочерний каталог, например /project/framework/?


person Justin    schedule 26.04.2012    source источник
comment
Отвечает ли это на ваш вопрос? Вложенные репозитории Git?   -  person Inigo    schedule 02.07.2021


Ответы (1)


Вы можете изучить поддержку подмодуля Git. Подмодуль позволяет встроить один репозиторий git в другой репозиторий git. Существуют альтернативные решения подобного рода вещей, но я сам ими не пользовался.

Пример может выглядеть так:

$ git clone git://github.com/username/project.git
$ cd project
$ git submodule add git://github.com/username/framework.git framework
$ git commit -m "added framework submodule"

Если вы клонируете репозиторий с подмодулями, вам необходимо использовать параметр --recursive:

$ git clone --recursive git://<repository-with-submodules>.git

Или, как вариант, вы можете регулярно клонировать, а затем запускать:

$ git submodule init
$ git submodule update

Прочтите связанный документ (и git submodule --help) для получения дополнительной информации.

Если в подмодуль вносятся изменения, вы вносите их следующим образом:

# first update the submodule just like any other git repository
$ cd project/framework
$ git pull

# now you have to record the new commit in the parent repository
$ cd ..
$ git commit -m "updated framework submodule"

Последний шаг необходим, потому что git хранит запись о конкретном коммите, связанном с данным подмодулем (так что, когда кто-либо клонирует родительский модуль, он получит эту версию подмодуля, а не его самую последнюю версию, которая могла бы претерпели критические изменения, которые могут помешать его работе с родительским репозиторием должным образом). Поэтому, если вы обновляете подмодуль, вам нужно записать новый коммит в родительский.

Если вы сделаете изменения в framework подмодуле, вы снова просто git push их, как и в любом другом репозитории. Затем вам нужно будет зафиксировать новую ревизию в родительском модуле.

person larsks    schedule 26.04.2012
comment
Отлично, поэтому, когда в Framework внесены изменения, как мне добавить их в проект, когда это модуль? Кроме того, если я внесу изменения в Framework вместо проекта, как мне вернуть их в репозиторий Framework git? - person Justin; 26.04.2012
comment
Одно маленькое примечание. Подмодуль HEAD отсоединен, поэтому вы должны быть осторожны при внесении изменений в подмодуль. Создайте ветку (или переключитесь на ветку), внесите изменения, зафиксируйте и затем нажмите. - person GoZoner; 26.04.2012