У меня два SVN-проекта из другого репозитория SVN, использующего svn: externals .
Как я могу иметь такую же структуру макета хранилища в Git?
Git имеет два подхода, похожих, но не в точности эквивалентных svn: externals:
Объединение поддеревьев вставка кода внешнего проекта в отдельный подкаталог в вашем репо. Это подробный процесс настройки , который очень прост для других пользователей, поскольку он автоматически включается при извлечении или клонировании хранилища. Это может быть удобным способом включения зависимости в ваш проект. Изменения легко перенести из другого проекта, но их сложно отправить обратно. И если другой проект должен объединиться из вашего кода, истории проекта объединяются, и два проекта фактически становятся одним.
Подмодули Git ( manual ) ссылка на конкретный коммит в репозитории другого проекта, во многом как svn: externals с аргументом -r , Подмодули просты в настройке, но все пользователи должны управлять подмодулями, которые не включаются автоматически в кассы (или клоны). Несмотря на то, что легко отправить изменения обратно в другой проект, это может вызвать проблемы в случае изменения репо. Поэтому, как правило, нецелесообразно отправлять изменения обратно в проект, который находится в активной разработке.
-r
Как я упоминал в " Обновление новой версии подмодуля Git ", вы можете получить ту же внешнюю функцию SVN с подмодулями Git 1.8.2:
git config -f .gitmodules submodule.<path>.branch <branch>
Этого достаточно, чтобы подмодуль следовал за веткой (как в последнем коммите удаленной ветви подмодуля восходящее репо ). Все, что вам нужно сделать, это:
git submodule update --remote
Это обновит подмодуль.
Более подробная информация содержится в "git submodule отслеживании последних ".
git submodule
Чтобы преобразовать существующий субмодуль в один отслеживающий ветвь : см. все шаги в « Подмодулях Git: укажите ветку / тег ».
Я автор gil (git links) инструмента
У меня есть альтернативное решение проблемы - gil (git links) tool
Позволяет описывать и управлять сложными зависимостями git-репозиториев.
Кроме того, он обеспечивает решение проблемы git recursive submodules .
Предположим, у вас есть следующие зависимости проекта: пример графика зависимости git-репозитория
Затем вы можете определить .gitlinks файл с описанием отношений с репозиториями:
.gitlinks
# Projects CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master # Modules Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master fmt modules/fmt https://github.com/fmtlib/fmt.git master HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master zlib modules/zlib https://github.com/madler/zlib.git master # Scripts build scripts/build https://github.com/chronoxor/CppBuildScripts.git master cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
Каждая строка описывает git ссылку в следующем формате:
Наконец, вам нужно обновить корневой репозиторий с примерами:
# Clone and link all git links dependencies from .gitlinks file gil clone gil link # The same result with a single command gil update
В результате вы будете клонировать все необходимые проекты и правильно связать их друг с другом.
Если вы хотите зафиксировать все изменения в каком-либо репозитории со всеми изменениями в дочерних связанных репозиториях, вы можете сделать это с помощью одной команды:
gil commit -a -m "Some big update"
Команда Pull, push работает аналогично:
gil pull gil push
Инструмент Gil (git links) поддерживает следующие команды:
usage: gil command arguments Supported commands: help - show this help context - command will show the current git link context of the current directory clone - clone all repositories that are missed in the current context link - link all repositories that are missed in the current context update - clone and link in a single operation pull - pull all repositories in the current directory push - push all repositories in the current directory commit - commit all repositories in the current directory
Подробнее о проблема зависимости git рекурсивных подмодулей .