2013-03-31 3 views
2

У меня есть существующий репозиторий git с длинной историей. По деловым причинам я должен отразить этот репозиторий на сервере svn. Я пробовал несколько способов, но до сих пор не работал.Как я могу нажать git history на svn

ответ

2

Мне сложно сделать это некоторое время назад, поэтому я сделал несколько шагов из разных источников, чтобы сделать это. Эта процедура сохранит вашу полную историю git. Перед началом работы убедитесь, что у вас есть резервная копия вашего репозитория.

Первое, что нужно сделать, это создать пустой репозиторий svn. Когда вы закончите с этим убедитесь, что git-svn установлен и редактировать YOUT .git/config отслеживать вновь созданных svn сделок РЕПО:

[svn-remote "svn"] 
url = https://your.svn.repo 
fetch = :refs/remotes/git-svn 

Теперь вы можете получить свой svn репозиторий:

git svn fetch 

Вы должны увидеть удаленный филиал после вашего svn репо, вы можете проверить с:

git branch -a 

Теперь получить хэш ваш root commit и в svn отрасли:

git rev-list --parents master | grep '^.\{40\}$' 
git rev-parse remotes/git-svn 

Создание трансплантата:

echo <hash-of-root-commit> <hash-of-svn-branch-commit> >> .git/info/grafts 

Теперь, если вы используете графическую обертку для git (я использую tig) вы увидите, что ваш root commit спускается с svn-branch ,

На этом этапе вы должны распространять graft делает его постоянным:

git filter-branch -- remotes/git-svn --all 

Теперь нам не нужно больше, чтобы мы могли удалить его

rm .git/info/grafts 

Проверьте с вашим графическим мерзавца обертке что svn-branch является предком master.

Теперь вы почти закончили, перебазировать свою историю на верхней части туловища:

git svn rebase 

Теперь вы готовы совершить на ваш svn репо с использованием

git svn dcommit 

Я создал эту процедуру слияния информация я нашел here и here, поэтому спасибо соответствующим авторам. Я изменил первую часть, потому что предлагаемая процедура не сработала для меня.

2

Обратите внимание, что подход git-svn ведет к частичной потери истории. Вместо этого используйте SubGit, он сможет конвертировать хранилище Git в SVN, сохраняя историю всех филиалов.

Ниже вы можете найти пример использования SubGit в локальном режиме, т.е.когда оба диверсий и Git репозитории находятся на одном хосте:

$ subgit configure SVN_REPO 
# adjust SVN_REPO/conf/subgit.conf, so git.default.repository points to GIT_REPO 
# adjust SVN_REPO/conf/authors.txt to map SVN usernames to Git identities 
$ subgit install SVN_REPO 
$ subgit uninstall --purge SVN_REPO 

После того, как мы конвертированы Linux ядра Git репозиторий SVN таким образом. Надеюсь, это поможет.

Смежные вопросы