Процедура клонирования 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 необходимо отдельно устанавливать на каждой машине разработки (хотя репозиторий по-прежнему можно использовать без него).