Процедура клонирования репозиториев Git, использующих поддерево - PullRequest
10 голосов
/ 08 июля 2010

Я использую команду Git subtree для добавления нескольких библиотек в проект.

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

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

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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 июля 2012

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

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

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 голосов
/ 23 июня 2011

Способ, которым я в прошлом воссоздал эти отношения, заключался в слиянии поддеревьев.

git pull -s subtree <lib> master

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

0 голосов
/ 31 марта 2017

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

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

...