Преобразование svn в git, как получить ветки не просто удаленные в svn-репо?

Я новичок в git, и я пытаюсь переместить репозиторий svn на git. Я следил за инструкцией ниже, так что теперь у меня есть репозиторий git на моем сервере
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/

Итак, если я делаю "git branch" git отвечает "* master", и если я делаю "git branch -r", я получаю список всех ветвей в репозитории svn.

Мои последние svn-checkins были в одной из ветвей, но когда я выполнил "git svn clone", то мои коммиты в этой ветке (они еще не были объединены в туловище) видны в моей (git). Что мне здесь не хватает?

Кроме того, если я на моей машине разработки делаю "git clone", я получаю файлы в порядке. Но если я делаю "git branch -r", я могу видеть только ветку мастера, а не удаленные ветки ".

Поскольку мы все время избавляемся от svn-repo, я хотел бы иметь все ветки svn в git -repo, чтобы с ними можно было обращаться от клиентов-разработчиков.

Опять же, я не полный новичок git, но недалеко от него. Так что, если есть что-то фундаментальное, я здесь пропал без вести, пожалуйста, скажите мне.

Обновление
После выполнения некоторого RTFM (man git -svn) я решил первую проблему с ветвями, присутствующими в главной ветке

reset - жесткие пульты/туловище

Теперь соединительная линия и главная ветка те же. Теперь нужно выяснить, как получить ветки от клиентов разработки.

Обновление 2
Я получил его, объединив url выше и URL, на который указал Скотт. Итак, с самого начала.

Сначала я создал пустой сервер на сервере, они хранятся в /usr/local/ git -repos на нашем сервере:

server> cd /usr/local/git-repos
server> mkdir my_project.git
server> cd my_project.git
server> git init

Затем я клонировал svn-репозиторий моей dev-машине (обратите внимание, что на нашем svn-сервере директория "ветки" называется "ветка" witout the 's):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project

Затем очистка, чтобы получить теги и ветки в порядке:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
dev> rm -Rf .git/refs/remotes/tags
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/
dev> rm -Rf .git/refs/remotes

Теперь добавьте мой сервер в качестве удаленного репозитория:

dev> git remote add origin [email protected]<our_server>:/usr/local/git-repos/my_project.git

Наконец, нажмите все ветки и теги на сервер:

dev> git push origin --all

Фу, теперь у вас это есть, теперь я могу избавиться от этого svn-repo.

Обновление 3
Оформить заказ ebneters post ниже для более легкого способа сделать это...

Ответы

Ответ 1

Существует довольно подробное объяснение того, как сделать довольно хороший импорт SVN, который объясняет, как правильно преобразовать ветки:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

Короткий ответ заключается в следующем:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes

Надеюсь, что это поможет.

Ответ 2

Другим хорошим способом сделать это, просто для записи, является использование svn2git - m в середине преобразования нескольких довольно больших хранилищ, и это было находкой. Он автоматизирует все шаги, необходимые для ухода за ветками и конвертирует теги svn в реальные теги git.

Ответ 3

Решение Скотта не помогло мне. Я подозреваю, что что-то изменилось в последней версии git -svn, так как он опубликовал это (и так как была написана связанная книга), поскольку, похоже, он агрессивно собирает мусор, как только клон завершен. Но это всего лишь предположение, почему это не сработало. Я использую git 1.6.5.6.

В частности, мой каталог .git/refs/remotes был полностью пуст, за исключением каталога тегов, который также был пуст. Поэтому я ничего не могу скопировать, чтобы сделать это правильно.

После некоторого поиска я смог исправить это, проверив файл .git/упакованный-refs и выполнив поиск и замену следующим образом (в этом порядке):

refs/remotes/tags => refs/tags
refs/remotes => refs/heads

Если ваш редактор vim, вы можете сделать это с помощью этих двух команд:

:%s/refs\/remotes\/tags/refs\/tags/g
:%s/refs\/remotes/refs\/heads/g

svn2git 1.3.1 также не принесла мне полезного результата (не импортировал никаких коммитов после определенного момента несколько месяцев назад, а ветки всех показали одни и те же коммиты). На данный момент я отказался от svn2git и добился наибольшего успеха, используя git -svn в сочетании с приведенным выше.

Желаемое мышление: было бы неплохо, если бы git -svn просто добавила команду вроде "отказаться" или "мигрировать", которая автоматизировала бы этот процесс надежным способом.

Ответ 4

Я переместил 2 svn repos на git (git версия 1.7.0.4) после рецепта Скотта, более мелкого и большего. Чем меньше человек, тем лучше, как описано Скоттом в главе книги. Большему требовалось решение Дэвида. Другое дело, что

$ git push origin --all

не нажал никаких тегов, и вместо этого я должен был сделать это:

$ git push origin --all
$ git push origin --tags

Это может быть не очевидно из флага - все и из главы книги, и я понял это после того, как я удалил локальный git svn repo.