SVN для миграции Git

itdoesntwork спросил: 31 июля 2018 в 09:57 в: git

У меня плохо структурированное репо SVN. Позвольте мне попытаться дать вам изображение.

svn-repo
|
|--branches
|     |
|     |-- project1
|     |-- project2
|     |-- tragetProject
|               |
|               |-- targetProject5.0.0
|               |-- targetProject5.0.1
|               |-- targetProject5.0.2
|               |-- ...
|
|--trunk
      |
      |-- project1
      |-- project2
      |-- ...

Проект, который я хочу перенести, - это "targetProject". Каждая ветвь получена из последней ветви, например. 5.0.1 - это ветвь от 5.0.0. Таким образом, каждая ветвь в svn имеет историю фиксации своего предка.

Это процесс, который я пробовал, чтобы перейти на git.

git svn init [trargetProject5.0.2 Url]
git svn fetch

Моя проблема что хотя ветвь svn имеет всю историю фиксации, после извлечения в локальном хозяине git существует только история фиксации этой ветви, а не ее предков.

Мне нужно получить всю историю. Я попытался изменить url ветки git в git config, чтобы получить коммиты для каждой ветки, но это также не удалось, так как "git svn rebase" не работает должным образом. Мне также нужно получить новые коммиты, возможно, новой ветки, созданной в svn repo. Может ли кто-нибудь помочь или предоставить мне новый способ справиться с этим? Спасибо.

2 ответа

Marina Liu - MSFT ответил: 31 июля 2018 в 04:02

Чтобы перенести SVN в Git с сохранением всех историй, вы можете использовать команду:

git svn clone <svn-repo URL> --branches=branches --tags=tags --trunk=trunk

Теперь все истории коммитов хранятся в git repo. По умолчанию там есть только локальная ветвь master, но другие ветки можно найти с помощью git branch -r.

и вывода git branch -r Команда выглядит как origin/branch1. Тогда вам просто нужно извлечь все ветви локально с помощью git branch -b <local Branch name> <remote branchname>.

Как показано в примере выше, чтобы оформить branch1 локально, вы можете использовать команду git checkout -b branch1 origin/branch1.

itdoesntwork ответил: 03 августа 2018 в 07:13
Спасибо за ответ .. Я попробую это .. Но это собирается клонировать каждый проект правильно? Моя проблема в том, что структура svn плохая и содержит много разных проектов, а тот, который я хочу перенести, находится в папке филиала в репозитории svn. Также проект, который я хочу перенести, имеет новую ветку для каждой версии. Вы рекомендуете клонировать весь репозиторий, а затем создать новую ветку, объединяющую нужные мне svn ветви?
Marina Liu - MSFT ответил: 03 августа 2018 в 07:17
@itdoesntwork вы имеете в виду только клонировать определенную ветку вместо всех ветвей, тогда вы можете указать это в опции --branches. Например, --branches=branches\tragetProject.
Есть решение
itdoesntwork ответил: 04 августа 2018 в 09:27

Хорошо, я нашел решение.

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

git svn clone -T branches/tragetProject/tragetProject5.0.2 http://example.com/PROJECT

Это клонирует текущую ветвь, а также ищет у каждого родителя всю историю коммитов.

Потому что мой репозиторий SVN Огромный и все ветви связаны друг с другом, этой команде потребовалось бы много времени, чтобы получить нежелательные коммиты из старых веток. Добавляя -r<revision>:HEAD в конце, вы ограничиваете расследование клона определенной ревизией.

Таким образом, команда становится такой:

git svn clone -T branches/tragetProject/tragetProject5.0.2 http://example.com/PROJECT -r40000:HEAD

Надеюсь, что это помогает кому-то в будущем.

ref https://gist.github.com/trodrigues/1023167#file-gistfile1-txt-L30