Вопрос: Как перенести репозиторий SVN с историей в новый репозиторий Git?


Я читал руководство Git, FAQ, Git-SVN crash course и т. Д., И все они объясняют это и это, но вы нигде не можете найти простую инструкцию:

Репозиторий SVN в: svn://myserver/path/to/svn/repos

Репозиторий Git в: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

Я не ожидаю, что это будет так просто, и я не ожидаю, что это будет одна команда. Но я ожидаю, что он не попытается объяснить что-либо - просто сказать, какие шаги следует предпринять с учетом этого примера.


1380


источник


Ответы:


Magic:

$ git svn clone http://svn/repo/here/trunk

Git и SVN работают по-разному. Вам нужно изучить Git, и если вы хотите отслеживать изменения из SVN вверх, вам нужно научиться git-svn, git-svnНа странице man есть хороший пример:

$ git svn --help

489



Создайте файл пользователя (т. users.txt) для сопоставления пользователей SVN с Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Вы можете использовать этот однострочный шрифт для создания шаблона из существующего репозитория SVN:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

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

Теперь вытащите данные SVN из репозитория:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Эта команда создаст новый репозиторий Git в dest_dir-tmpи начать вытаскивать репозиторий SVN. Обратите внимание, что флаг «--stdlayout» означает, что у вас есть общий макет SVN /, ветви /, теги / SVN. Если ваш макет отличается, ознакомьтесь с --tags, --branches, --trunkварианты (в общем git svn help).

Разрешены все общие протоколы: svn://, http://, https://, URL-адрес должен быть нацелен на базовый репозиторий, что-то вроде http://svn.mycompany.com/myrepo/repository , Это должно не включают /trunk, /tagили /branches,

Обратите внимание, что после выполнения этой команды очень часто выглядит, как операция «зависает / замораживается», и вполне нормально, что она может застрять в течение долгого времени после инициализации нового репозитория. В конце концов вы увидите сообщения журнала, которые указывают, что он мигрирует.

Также обратите внимание, что если вы опустите --no-metadataфлаг, Git добавит информацию о соответствующей ревизии SVN в сообщение фиксации (т. е. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Если имя пользователя не найдено, обновите users.txtфайл затем:

cd dest_dir-tmp
git svn fetch

Возможно, вам придется повторять эту последнюю команду несколько раз, если у вас большой проект, пока не будут получены все транзакции Subversion:

git svn fetch

Когда закончите, Git проверит SVN trunkв новую ветвь. Любые другие ветви настроены как пульт дистанционного управления. Вы можете просмотреть другие ветви SVN:

git branch -r

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

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Теги импортируются как ветки. Вы должны создать локальную ветвь, создать тег и удалить ветвь, чтобы иметь их как теги в Git. Сделать это с помощью тега "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Скройте хранилище GIT-SVN в чистый репозиторий Git:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Локальные ветви, созданные вами ранее из удаленных филиалов, будут скопированы только как удаленные ветви в новый клонированный репозиторий. (Пропустить магистраль / мастер.) Для каждой ветки, которую вы хотите сохранить:

git checkout -b local_branch origin/remote_branch

Наконец, удалите удаленный из вашего чистого репозитория Git, который указывает на теперь удаленный временный репозиторий:

git remote rm origin

1453



Чисто перемещайте репозиторий Subversion в репозиторий Git , Сначала вы должны создать файл, который отображает имена авторов транзакций Subversion для Git-коммандеров, скажем, ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Затем вы можете загрузить данные Subversion в репозиторий Git:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Если вы на Mac, вы можете получить git-svnот MacPorts, установив git-core +svn,

Если ваш репозиторий subversion находится на том же компьютере, что и ваш желаемый репозиторий git, то вы можете использовать этот синтаксис для шага init, иначе все равно:

git svn init file:///home/user/repoName --no-metadata

179



Я использовал скрипт svn2git и работает как шарм! https://github.com/nirvdrum/svn2git


67



Я предлагаю вам комфортно с Git, прежде чем пытаться постоянно использовать git-svn, т. Е. Сохраняя SVN в качестве централизованного репо и используя Git локально.

Однако, для простой миграции со всей историей, вот несколько простых шагов:

Инициализировать локальное репо:

mkdir project
cd project
git svn init http://svn.url

Отметьте, как далеко назад вы хотите начать импорт версий:

git svn fetch -r42

(или просто «git svn fetch» ​​для всех оборотов)

Собственно забирай все с тех пор:

git svn rebase

Вы можете проверить результат импорта с помощью Gitk. Я не уверен, что это работает в Windows, оно работает на OSX и Linux:

gitk

Когда вы клонируете свой репозиторий SVN локально, вы можете нажать его на централизованное репозиторинг Git для упрощения совместной работы.

Сначала создайте пустую дистанционную репо (возможно, на GitHub ?):

git remote add origin git@github.com:user/project-name.git

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

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

После этого вам может быть интересно попробовать свои собственные git_remote_branchинструмент, который помогает работать с удаленными ветвями:

Первый пояснительный пост: " Удаленные ветви Git "

Последующие действия для последней версии: Время, чтобы сотрудничать с git_remote_branch "


56



There is a new solution for smooth migration from Subversion to Git (or for using both simultaneously): SubGit (http://subgit.com/).

I'm working on this project myself. We use SubGit in our repositories - some of my teammates use Git and some Subversion and so far it works very well.

To migrate from Subversion to Git with SubGit you need to run:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

After that you'll get Git repository in svn_repos/.git and may clone it, or just continue to use Subversion and this new Git repository together: SubGit will make sure that both are always kept in sync.

In case your Subversion repository contains multiple projects, then multiple Git repositories will be created in svn_repos/git directory. To customize translation before running it do the following:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

With SubGit you may migrate to pure Git (not git-svn) and start using it while still keeping Subversion as long as you need it (for your already configured build tools, for instance).

Hope this helps!


29



See the official git-svn manpage. In particular, look under "Basic Examples":

Tracking and contributing to an entire Subversion-managed project (complete with a trunk, tags and branches):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16



Pro Git 8.2 explains it: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git


14