Как перенести плоский репозиторий svn в репозиторий git

У меня есть плоский репозиторий svn, который выглядит так:

my_repo/
├── file1.c
├── file2.c
├── file3.c
└── README

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

Я пытался:

git svn clone --trunk=/ -A users.txt svn+ssh://[email protected]/projects/my_repo dest_dir

Что, как я предполагал, сработает, однако, когда я перехожу к dest_dir и выполняю git svn fetch, похоже, ничего не получается. Использование git log дает:

fatal: bad default revision 'HEAD'

Если я использую svn checkout svn+ssh://[email protected]/projects/my_repo, он возвращает:

A    my_repo/file1.c
A    my_repo/file2.c
A    my_repo/file3.c
A    my_repo/README
Checked out revision 57.

Так что репозиторий жив и доступен.

Я пробовал различные инструменты, включая subgit, который выдавал мне эту ошибку: svn: E170003: 'stat' not implemented, и я думаю, что это связано с тем, что сервер, на котором размещен репозиторий, использует старую версию subversion. У меня нет контроля над сервером, поэтому я не могу выполнить обновление.

Я также пытался использовать svn2git, используя команду

svn2git svn+ssh://[email protected]/projects/my_repo --rootistrunk -authors users.txt --verbose

но это дало мне еще одну ошибку:

E: 'svn+ssh:/[email protected]/projects/my_repo' is not a complete URL and a separate URL is not specified command failed

Это поставило меня в тупик, и я понятия не имею, почему это не работает. В основном мне было интересно, как мне превратить репозиторий svn в репозиторий git, сохраняя при этом историю. Надеюсь, кто-то может мне помочь или указать мне правильное направление. Никогда не думал, что будет так сложно перенести этот простой репозиторий в git!

Спасибо


person user3277112    schedule 04.04.2014    source источник
comment
Вы уверены, что git svn clone не выдал ошибку? Это должно было сработать. Кроме того, после git svn clone, если вы войдете в каталог и сделаете git svn fetch, что произойдет?   -  person janos    schedule 06.04.2014
comment
Ваш сервер SVN действительно довольно старый. Рассмотрите возможность использования утилиты svnsync для загрузки всех версий SVN на локальный компьютер, а затем попробуйте импортировать этот локальный репозиторий в Git.   -  person vadishev    schedule 07.04.2014


Ответы (3)


Проблема с аргументом --rootistrunk svn2git. Вместо этого попробуйте следующее:

svn2git svn+ssh://[email protected]/projects/my_repo --trunk / --notags --nobranches --authors users.txt --verbose
person Nick K9    schedule 29.10.2014

У меня такая же проблема. Нестандартный репозиторий svn: без транка, без тега, без ответвления. Я проверил все возможные варианты svn2git, но безуспешно. Поскольку svn2git — это просто оболочка ruby ​​для git svn, я попробовал напрямую git svn, и все было в порядке. Вот что я сделал.

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

1. git svn init http://svnmydomain.com/urlpart/projectname --trunk=/ --tags=/ --branches=/

Если репозиторий svn защищен паролем, вам придется указать аргументы имени пользователя и пароля для приведенной выше команды, но в большинстве случаев это не сработает, так как немного глючит. Вместо этого svn checkout в текущей папке. git svn будет использовать svn cash и не будет запрашивать пароль.

Убедитесь, что конфигурация git в порядке. Тип

2. git config --list

Вы должны увидеть это:

svn-remote.svn.url=http://svnmydomain.com/urlpart    
svn-remote.svn.fetch=urlpart/projectname:refs/remotes/origin/trunk
svn-remote.svn.branches=urlpart/projectname/*:refs/remotes/origin/*
svn-remote.svn.tags=urlpart/projectname/*:refs/remotes/origin/tags/*

Если конфигурация git неверна, исправьте ее вручную, выполнив

git config <key> <value>

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

3. git svn fetch
4. git remote add origin git@gitdomain:url/gitproject.git
5. git add .
6. git commit -m "merge from svn"
7. git push origin master

Если некоторые люди продолжают работать в svn, вам нужно будет постоянно синхронизировать svn с git. Для этого введите:

8. git svn rebase
9. git push origin master 
person Nare    schedule 25.11.2016

Столкнулся с той же проблемой со старым «плоским» репозиторием SVN, после чего работал с git v2.20.1: (следуя рецепту на http://www.sailmaker.co.uk/blog/2013/05/05/migrating-from-svn-to-git-preserving-branchs-and-tags-3/ )

git svn init <SVN https URL> --stdlayout --prefix=svn/ -T /
git svn fetch --all
person Coleman Corrigan    schedule 05.09.2019