Процедура клонирования Git repos, которые используют поддерево

Я использую команду Git поддерева, чтобы вытащить несколько библиотек в проект.

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

Какой лучший способ восстановить это соединение?

Достаточно ли делать

git remote add <lib> <remote-url>
git fetch <lib>

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

git subtree add -P <local/lib> --squash "<lib>/master"

Это не работает, когда локальный каталог уже существует, хотя, конечно, это будет, когда вы клонировали проект, в который уже была добавлена ​​библиотека.

Есть ли что-нибудь еще, что нужно делать в этой ситуации, чтобы гарантировать, что последующие слияния поддерева Git и Git команды разделения поддерева к ожидаемой?

Ответ 1

То, что у меня было в прошлом, воссоздало эти отношения, выполнив слияние поддерева.

git pull -s subtree <lib> master

даже если нечего сливать в /pull, он должен просто вернуться, ничего не делая. Не стесняйтесь добавлять --squash к вышеуказанному притяжению, чтобы вы не тянули ни одну удаленную историю.

Ответ 2

У меня была очень похожая проблема

Вот как я сначала создал поддерево

git remote add -f sub_project url_to_remote_repository/project.git
git merge -s ours --no-commit sub_project/master
git read-tree --prefix=sub/project/ -u sub_project/master
git commit -m "Added subtree merged in sub/project"

и чтобы получить изменения в репозитории проекта, я делал

git pull -s subtree sub_project master

Теперь я нажал мой локальный репозиторий на github и с другой машины я клонировал свой репозиторий github В этот момент я получил весь ожидаемый файл в sub/project... так здорово. Но не более отдаленный, и связь с суб/проектом. Поэтому я сделал следующее

git remote add -f sub_project url_to_remote_repository/project.git
git merge -s ours --no-commit --squash sub_project/master
git pull -s subtree sub_project master

И это сработало хорошо. Теперь я могу управлять поддеревом из этого клонированного репозитория, как раньше

git pull -s subtree sub_project master

Примечание:

1) в нашем проекте, прежде чем мы использовали подмодули git, которые были действительно не хороши для наших пользователей. Поэтому мы переключились на систему поддерева git.
2) У меня были некоторые странные ошибки при выполнении этих операций на компьютере Windows (с использованием git версии 1.7.9.msysgit.0), и те же операции были успешно выполнены в Linux. Итак, теперь, чтобы манипулировать поддеревом, я часто использую linux (и если у меня есть какая-либо ошибка, я пробую то же самое в linux).

Надеюсь, это поможет.

Ответ 3

Я столкнулся с этим вопросом при переносе проекта с использованием подмодулей в поддеревья и в конечном итоге не использовал ни (по крайней мере, не напрямую, так или иначе). Теперь я использую git-subrepo.

Он решает эту проблему, добавляя файл .gitrepo в корень каждого поддерева. Файл .gitrepo содержит информацию отслеживания, включая удаленный URL, и затем включается в последующие клоны. Это действительно упрощает вещи, и единственное усложнение заключается в том, что git -subrepo необходимо отдельно устанавливать на каждой машине разработки (хотя репозиторий по-прежнему можно использовать без него).