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

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

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

Схема репозитория:

/
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?


person Darknight    schedule 18.03.2013    source источник
comment
Как вы его импортировали? Вы пробовали использовать переключатель --stdlayout git svn clone?   -  person mgarciaisaia    schedule 18.03.2013
comment
Я предлагаю вам переименовать вопрос во что-то более конкретное, например, как исправить ветки частичной структуры каталогов при миграции SVN на Git.   -  person robinst    schedule 18.03.2013
comment
@desert69 Я импортировал его с помощью svn2git, но также пытался использовать метод, описанный в winklerweb.net/index.php/blog/4-eclipse/ с теми же результатами.   -  person Darknight    schedule 18.03.2013


Ответы (1)


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

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

project1/
project2/
project3/
project4/

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

project3/

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

.project
src/
test/

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

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

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

Шаг 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

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

person robinst    schedule 18.03.2013
comment
Еще не пробовал, но боюсь, что предположения сломаются. Когда я проверяю ветку project3-production-branch в GIT, папка project3 исчезает, и все файлы попадают в корень репозитория. Технически, я могу просто перемещать их и фиксировать изменения, но мне нужны другие файлы для ветки, чтобы иметь смысл. Собираюсь взглянуть на это сейчас. - person Darknight; 18.03.2013
comment
Хорошо, это было бы полезно иметь в вопросе. Если вы посмотрите на историю ветки, она начинается с транка (и начало выглядит разумным) или она полностью отдельная? А в первом коммите много удалений и добавлений (возможно, переименований)? Это все еще возможно исправить, но для этого сначала требуется отдельный проход filter-branch. Найдите Чтобы переместить все дерево в подкаталог в filter-branch. - person robinst; 19.03.2013
comment
После опробования описанного решения и проведения некоторого тестирования, а также сравнения с svn и svn с ветками теперь кажется, что все работает и так и должно быть. Решение работает так, как описано, но я получаю сообщение об ошибке в транке в родительском (строка 2) (думаю, что такого объекта нет). Тем не менее, перезапись работала нормально (с сообщением об ошибке). После этого я переместил соответствующие папки из веток с помощью git mv, чтобы они оказались в подпапках, а не в корне репозитория. Спасибо :) - person Darknight; 19.03.2013
comment
Хорошо, тогда ветка уже называется master (зависит от того, как вы сделали миграцию из SVN). Я обновил свой ответ, если вы повторите его с первым шагом, даже старые коммиты в ветке будут правильными, так как вам не нужно делать git mv коммит. - person robinst; 19.03.2013