Как исправить ветки частичной структуры каталогов в 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
Он сбрасывает другие пути в состояние, в котором они находились при создании ветви, для всех коммитов из ветви.