Как исправить ветки частичной структуры каталогов в SVN для миграции Git

Я пытаюсь преобразовать SVN-репозиторий, содержащий приложение Java EE, в Git-репозиторий. Исходный репозиторий содержит папку для каждой части проекта Java EE, которая поддерживалась как отдельные проекты в истории. Для двух проектов есть также ветвь "производство" (опять же, две отдельные ветви), и всякий раз, когда новая ревизия идет в производство, ствол объединяется в производство.

Когда я импортирую это в один репозиторий git (как я понимаю, было бы лучше всего), все в master работает нормально, но когда я переключаюсь на ветку, я получаю только файлы этой ветки, а большинство других папок и файлов исчезают.

Расположение репозитория:

/
trunk/
   project1/
   project2/
   project3/
   project4/
branches/
   project3-production-branch/
   project4-production-branch/
tags/

Я нашел сообщение Эрика Гвина об этой проблеме, но я не мог видеть, что есть какие-то решения для этого. http://comments.gmane.org/gmane.comp.ide.eclipse.git/77

Я мог бы упускать из виду кое-что очень элементарное здесь, но я боюсь, что единственное решение - импортировать проекты отдельно? Любые предложения о том, как я могу импортировать весь SVN-репо и получить рабочие ветки в Git?

1 ответ

Решение

Исходная ситуация

После преобразования этого в один репозиторий структура каталогов в master (или trunk) выглядит следующим образом:

project1/
project2/
project3/
project4/

Структура после первого коммита project3-production-branch выглядит так:

project3/

Или содержит непосредственно содержимое проекта3:

.project
src/
test/

Это зависит от того, откуда была скопирована ветка в Subversion.

В первом случае следующий шаг можно пропустить.

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

Шаг 1: переписать ветку, чтобы переместить все содержимое в подкаталог (если необходимо)

Посмотрите пример "Чтобы переместить все дерево в подкаталог" в filter-branch и выполнить это только в ветке, например так:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&project3/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' \
     master..project3-production-branch

Шаг 2: Переписать ветку для восстановления других проектов

На этом шаге мы хотим отменить удаление других проектов в первом коммите ветки. Это можно сделать с помощью следующего:

branch="project3-production-branch"
parent=`git merge-base $branch master` # or replace master with trunk if needed
paths="project1 project2 project4"
git filter-branch -f --index-filter \
"git reset -q $parent -- $paths" --tag-name-filter cat -- \
$parent..$branch

Он сбрасывает другие пути в состояние, в котором они находились при создании ветви, для всех коммитов из ветви.

Другие вопросы по тегам