Статьи

Извлечение частей из Git Repository и ведение истории

В какой-то момент программный проект выйдет за рамки своей первоначальной сферы. Во многих случаях некоторые части проекта становятся их собственным мини-миром. В целях обслуживания часто выгодно разделять их на свои собственные проекты. Кроме того, история коммитов для извлеченного проекта не должна быть потеряна. С помощью Git этого можно добиться с помощью git-subtree .

Хотя git-subtree достаточно мощный, для этой задачи нам нужна функция разделения. Документация говорит следующее относительно этой функции разделения :

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

Это оказывается довольно просто. На самом деле, уже есть ответ переполнения стека, в котором описаны необходимые пошаговые инструкции . Приведенная ниже иллюстрация, также относящаяся к реальному репо, может служить дополнительным примером этого варианта использования.

Прежде всего, убедитесь, что у вас есть свежая версия Git:

git --version

Если написано 1.8.3, то получите более новую версию, так как есть ошибка ( исправленная в 1.8.4), которая сильно загрязнит ваши журналы коммитов, то есть добавляя «-n» везде.

Предположим, что в этом примере мы хотим извлечь забавный автоматический генератор имен (для контейнера) из проекта Docker в его собственный Git-репозиторий. Начнем с клонирования основного хранилища Docker:

git clone https://github.com/dotcloud/docker.git
cd docker

Затем мы разбиваем генератор имен, который находится под ним pkg/namesgenerator, и помещаем его в отдельную ветвь. Здесь называется ветка, namesgenно не стесняйтесь называть ее как угодно.

git-subtree split --prefix=pkg/namesgenerator/ --branch=namesgen

Вышеуказанный процесс займет некоторое время, в зависимости от размера хранилища. Когда он будет завершен, мы можем проверить это, проверив историю коммитов:

git log namesgen

Следующим шагом является подготовка места для нового репозитория (выберите любой каталог, который вы предпочитаете). Оттуда все, что нам нужно сделать, это вытащить ветку namesgen, которая была разделена ранее:

cd ~
mkdir namesgen
cd namesgen
git init
git pull /path/to/docker/checkout namesgen

Это оно! Конечно, обычно вы хотите отправить это на некоторый удаленный компьютер, например, в репозиторий на GitHub или Bitbucket или на свою собственную конечную точку Git:

git remote add origin git@github.com:joesixpack/namesgen.git
git push -u origin --all

Новый репозиторий будет содержать только файлы из pkg/namesgenerator/каталога из репозитория Docker. И очевидно, что каждый коммит, который касается этого каталога, все еще появляется в истории.

Миссия выполнена!