Как да прехвърлим SVN хранилището с история в новото хранилище на Git?

Прочетох урока Git, често задаваните въпроси, Git - SVS курса на курса и т.н., и всички те го обясняват и това, но никъде не можете да намерите проста инструкция като:

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 

Не очаквам да е толкова просто и не очаквам да е един отбор. Но аз очаквам, че той няма да се опита да обясни нещо, аз просто ще кажа какви стъпки трябва да предприемем в този пример.

1312
17 сент. зададен от Милан Бабушков 17 сеп. 2008-09-17 05:04 '08 в 5:04 am 2008-09-17 05:04
@ 30 отговора

Magic:

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

Git и SVN работят по различен начин. Трябва да научите Git и ако искате да проследявате промените от SVN, трябва да научите git-svn . Има добър пример на git-svn ръчна страница:

 $ git svn --help 
465
17 сент. отговорът е даден jfm3 17 sep . 2008-09-17 05:08 '08 в 5:08 am 2008-09-17 05:08

Създайте потребителски файл (т.е. users.txt ), за да users.txt SVN потребителите с Git:

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

Можете да използвате този единичен шрифт, за да създадете шаблон от съществуващо хранилище за SVN:

 svn log --xml | grep "<author>" | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' | tee 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 транзакции бъдат получени:

border=0
 git svn fetch 

При завършване Git ще провери SVN trunk към нов клон. Всички други клонове са конфигурирани като дистанционно управление. Можете да видите други клонове на SVN:

 git branch -r 

Ако искате да запишете други отдалечени клонове в хранилището си, искате да създадете локален клон за всеки един от тях ръчно. (Прескачане на магистрала / главен.) Ако не направите това, клоновете няма да бъдат клонирани в последния етап.

 git checkout -b local_branch remote_branch # It 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 
1383
19 окт. Отговорът е даден от cmcginty 19 октомври. 2010-10-19 22:45 '10 в 22:45 ч. 2010-10-19 22:45

Преместете хранилището на 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 .

Ако вашето хранилище на подривна дейност е на същия компютър като желания от Вас хранилище на Git, тогава можете да използвате този синтаксис за стъпката на init, в противен случай няма значение:

 git svn init file:///home/user/repoName --no-metadata 
172
17 сент. отговорът е даден от Юджийн Йокота 17 сеп. 2008-09-17 05:10 '08 в 5:10 am 2008-09-17 05:10

Използвах svn2git скрипта и работи като чар! https://github.com/nirvdrum/svn2git

64
01 февр. Отговорът е даден от Thiago Leão Moreira 01 Feb. 2011-02-01 10:53 '11 в 10:53 2011-02-01 10:53

Предлагам ви да работите удобно с 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 repo, за да опростите сътрудничеството.

Първо създайте празно отдалечено репо (може би в 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 time, работа с git_remote_branch "

54
17 сент. отговорът е даден webmat 17 sep . 2008-09-17 21:20 '08 в 21:20 ч. 2008-09-17 21:20

Има ново решение за плавна миграция от Subversion към Git (или за едновременно използване): SubGit ( http://subgit.com/ ).

Самият аз работя по този проект. Ние използваме SubGit в нашите хранилища - някои от моите съотборници използват Git и някои Subversion, и досега работи много добре.

За да превключите от Subversion на Git с помощта на SubGit, трябва да стартирате:

 $ subgit install svn_repos ... TRANSLATION SUCCESSFUL 

След това ще получите хранилището на Git в svn_repos / .git и ще можете да го клонирате или просто да продължите да използвате Subversion и този нов Git хранилище заедно: SubGit ще се увери, че и двете са винаги синхронизирани.

Ако вашето хранилище на Subversion съдържа няколко проекта, тогава в директорията svn_repos / git ще бъдат създадени няколко хранилища Git. За да настроите излъчването преди стартирането, направете следното:

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

С SubGit можете да превключите на чист Git (не git -svn) и да започнете да го използвате, като поддържате Subversion колкото ви е нужен (например за вече конфигурираните инструменти за изграждане).

Надявам се това да помогне!

26
24 нояб. Отговор, даден от Александър Китаев на 24 ноември. 2011-11-24 23:12 '11 в 23:12 ч. 2011-11-24 23:12

Вижте официалната страница на git -svn . По-специално вижте раздела "Основни примери":

Проследяване и принос към цял проект, управляван от Subversion (пълна с trunk, tags и branch):

 # Clone a repo (like git clone): git svn clone http://svn.foo.org/project -T trunk -b branches -t tags 
15
17 сент. Отговорът е даден от EfForEffort на 17 септември . 2008-09-17 20:09 '08 в 20:09 ч. 2008-09-17 20:09
13
12 февр. Отговорът е даден kdahlhaus 12 февруари. 2011-02-12 00:17 '11 в 0:17 2011-02-12 00:17

SubGit (срещу син екран)

 subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo 

All.

+ За да се актуализира от SVN, хранилището на Git, създадено от първата команда.

 subgit import directory/path/Local.git.Repo 

Използвах начин за незабавно превключване към git за огромно хранилище.
Разбира се, имате нужда от обучение.
Но никога не можете да спрете процеса на развитие.

Тук е моят път.

Решението ми изглежда така:

  • Мигрирайте SVN в хранилище Git
  • Актуализирайте хранилището на git, преди да преместите командата на .

Миграцията отнема много време за голям SVN хранилище.
Актуализирането на завършената миграция е само секунди.

Разбира се, използвам SubGit , мамо. git -svn ме прави син екран на смъртта . Просто постоянно. И git -svn ми отегчи с git " filename too long " фатална грешка.

СТЪПКИ

1. Изтеглете SubGit

2. Подгответе команди за прехвърляне и обновяване.

Да кажем, че правим това за Windows (това е тривиално за Linux порта).
В SubGit bin директорията (subgit-2.XX bin), създайте два .bat файла.

Съдържание на файла / командата за прехвърляне:

 start subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo 

Командата "Старт" не е задължителна (Windows). Това ще ви позволи да видите грешки при стартиране и да оставите черупката отворена след завършване на SubGit.

Тук можете да добавите допълнителни параметри, подобни на git -svn . Използвам само - домейн myCompanyDomain.com по подразбиране, за да коригирам домейна на имейл адреса на авторите на SVN.
Имам стандартна структура на SVN хранилище (trunk / branches / tags) и нямахме проблеми с "mapping". Затова не правя нищо повече.

(Ако искате да прехвърлите тагове, например, клонове или SVN, за да имате няколко папки за клонове / етикети, можете да използвате по-подробен подход на Subgit)

Съвет 1 . Използвайте --minimal-revision YourSvnRevNumber, за да видите бързо как вървят нещата (някакъв вид отстраняване на грешки). Особено полезно е да видите упълномощени имена на автори или имейли.
Или ограничете дълбочината на миграционната история.

Съвет 2 . Миграцията може да бъде прекъсната ( Ctrl + C ) и да бъде възстановена чрез изпълнение на следния файл команда / актуализация.
Не съветвам да правите това за големи хранилища. Имам "Изчерпателно изключение на Java + Windows".

Съвет 3 . По-добре е да създадете копие на хранилището си без резултати.

Съдържание на файла / командата за актуализиране:

 start subgit import directory/path/Local.git.Repo 

Можете да го стартирате произволен брой пъти, когато искате последната команда да обвърже вашия git хранилище.

Внимание! Не докосвайте голото си хранилище (например създаване на клонове).
Ще получите следната фатална грешка:

Невъзстановима грешка: не е синхронизирана и не може да бъде синхронизирана ... Превод на версии на Subversion в Git прави ...

3. Стартирайте първата команда / файл. За голямо съхранение е необходимо време. 30 часа за моето скромно съхранение.

All.
Можете да актуализирате хранилището на Git от SVN по всяко време, колко пъти като изпълните втория файл / команда. И преди да превключите екипа си за развитие към git.
Отнема няколко секунди.



Има и друга полезна задача.

Щракнете върху локалното хранилище Git към отдалеченото хранилище на Git

Това ли е вашият случай? Ние продължаваме.

  • Персонализирайте конзолите си

Стартирайте:

 $ git remote add origin url://your/repo.git 
  1. Подгответе се първоначално да изпратите огромното си локално хранилище в отдалечено хранилище.

По подразбиране вашият git не може да изпраща големи парчета. фатален: отдалечения край неочаквано затвори

Изпълнение за това:

 git config --global http.postBuffer 1073741824 

524288000 - 500 MB 1073741824 - 1 GB и др.

Поправете проблемите с местните сертификати . Ако вашият git сървър използва счупен сертификат.

Имам забранени сертификати .

В допълнение, вашият Git сървър може да има ограничения за броя на заявките, които трябва да бъдат поправени .

  1. Кликнете върху всички миграции към отдалеченото хранилище на Git.

Стартирайте с местен git:

 git push origin --mirror 

(начало на git push „*: *“ за по-стари версии на git)

Ако получите следното: error: Git не може да се появи: няма такъв файл или директория ... За мен пълното възстановяване на паметта ми разрешава тази грешка (30 часа). Можете да опитате следните команди

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

Или опитайте да преинсталирате Git ( безполезен за мен ). Или можете да създадете клонове от всичките си тагове и да ги кликнете. Или, или, или ...

12
06 февр. отговорът е даден на 3 февруари. 2015-02-06 14:12 '15 в 14:12 2015-02-06 14:12

reposurgeon

За сложни случаи хранилището на Eric S. Raymond е избор на инструмент. В допълнение към SVN, той поддържа много други системи за контрол на версиите чрез формат за fast-export , както и CVS . Авторът съобщава за успешни реализации в древни хранилища като Emacs и FreeBSD .

Инструментът е насочен към почти перфектно преобразуване (например, конвертиране на SVN svn:ignore свойства в .gitignore файлове) дори и за сложни оформления на хранилище с дълга история. В много случаи други инструменти могат да бъдат по-лесни за използване.

Преди да се reposurgeon командния ред на reposurgeon , не забравяйте да прочетете отличното Ръководство за миграция на DVCS , което ще ви преведе през процеса на конвертиране стъпка по стъпка.

7
20 марта '15 в 21:20 2015-03-20 21:20 отговорът е даден krlmlr 20 март '15 в 21:20 2015-03-20 21:20

Това ръководство е един от най-добрите, които намерих:

https://www.atlassian.com/git/migration

Този инструмент - https://bitbucket.org/atlassian/svn-migration-scripts - също е много полезен за създаването на вашия author.txt наред с други неща.

7
13 марта '14 в 16:58 2014-03-13 16:58 отговорът е даден от Андрю Б на 13 март 14 в 16:58 2014-03-13 16:58

Многократен разширен отговор, използващ само git, svn и bash. Тя включва стъпки за SVN хранилища, които не използват обичайното оформление с оформлението на trunk / branches / tags (SVN не прави абсолютно нищо, за да осигури такова оформление).

Първо, използвайте този bash скрипт, за да сканирате SVP repo за различни хора, които са допринесли за създаването на шаблон за файла за картографиране:

 #!/usr/bin/env bash authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq) for author in ${authors}; do echo "${author} = NAME <USER@DOMAIN>"; done 

Използвайте това, за да създадете файл с authors в който свързвате svn потребителски имена с потребителски имена и имейл, зададени от разработчиците ви, като използвате свойствата git config user.name и user.email (имайте предвид, че за услуга като GitHub, наличие на съответното писмо).

След това git svn клонира svn хранилището в хранилището на git, като му съобщи за съвпадението:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Това може да отнеме много време, тъй като git svn ще проверява индивидуално всяка ревизия за всеки съществуващ маркер или клон. (имайте предвид, че етикетите в SVN са наистина клонове, така че те се оказват такива в Git). Можете да го ускорите, като премахнете старите тагове и клонове в SVN, които не ви трябват.

Правейки това на сървър в една и съща мрежа или на същия сървър също може да го ускори. Освен това, ако по някаква причина този процес бъде прекъснат, можете да го възобновите

git svn rebase --continue

В много случаи сте тук. Но ако вашият SVN репо има нестандартно оформление, където имате директория в SVN, която искате да поставите в клона на git, можете да направите няколко допълнителни стъпки.

Най-простият е просто да създадете ново репо на SVN на вашия сървър, който е в съответствие със споразумението, и да използвате svn copy да поставите директорията в гръбнак или клон. Това може да е единственият начин, ако вашата директория е изцяло в основата на репо, когато последно го пробвах, git svn просто отказа да провери.

Можете също да направите това с помощта на git. За git svn clone просто използвайте директорията, която искате да поставите в git клона.

След старта

 git branch --set-upstream master git-svn git svn rebase 

Моля, обърнете внимание, че това изисква git 1.7 или по-висока.

6
25 сент. Отговорът е даден на 25 септември 2013-09-25 12:23 '13 в 12:23 ч. 2013-09-25 12:23

Трябва да инсталирате

 git git-svn 

Копирано от тази връзка http://john.albin.net/git/convert-subversion-to-git .

1. Вземете списък на всички податели на Subversion

Subversion просто изброява потребителското име за всеки ангажимент. Git s извършва много по-богати данни, но за най-простия автор на фиксацията трябва да посочите име и имейл адрес. По подразбиране инструментът git -svn просто ще изброи SVN потребителското име в полетата за автор и имейл. Но с малък обем работа, можете да създадете списък на всички SVN потребители и какво съответства на тяхното име и Git адреси. Този списък може да се използва от git -svn за преобразуване на прости SVN имена в подходящи Git изпълнители.

От корена на вашия локален Subversion тест, изпълнете следната команда:

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

Това ще улови всички съобщения в дневника, ще грабне потребителските имена, ще премахне всякакви дублирани потребителски имена, ще сортира потребителските имена и ще ги постави във файла "authors-transform.txt". Сега редактирайте всеки ред във файла. Например, конвертирайте:

 jwilkins = jwilkins <jwilkins> 

в това:

 jwilkins = John Albin Wilkins <johnalbin@example.com> 

2. Клонирайте хранилището на Subversion с git -svn

 git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp 

Това ще бъде стандартната git -svn трансформация (използвайки файла author-transform.txt, създаден в стъпка 1) и поставете хранилището на Git в папката "~ / temp" във вашата домашна директория.

3. Конвертирайте svn: ignore свойства преди .gitignore

Ако вашият svn repo използва свойствата на svn: ignore, можете лесно да го конвертирате в .gitignore файл, като използвате:

 cd ~/temp git svn show-ignore > .gitignore git add .gitignore git commit -m 'Convert svn:ignore properties to .gitignore.' 

4. Натиснете хранилището в хранилището на Git

Първо, създайте готино хранилище и направете неговия отговор по подразбиране svns "trunk".

 git init --bare ~/new-bare.git cd ~/new-bare.git git symbolic-ref HEAD refs/heads/trunk 

След това преместете временното хранилище в новото отворено хранилище.

 cd ~/temp git remote add bare ~/new-bare.git git config remote.bare.push 'refs/remotes/*:refs/heads/*' git push bare 

Сега можете безопасно да изтриете ~ / temp хранилището.

5. Преименувайте клона "багажник" на "капитан"

Вашият основен клон за развитие ще се нарича "trunk", което съответства на името, което беше в Subversion. Искате да го преименувате в стандартния клон на Git, като използвате:

 cd ~/new-bare.git git branch -m trunk master 

6. Почистване на клони и етикети

git -svn прави всички етикети на Subversions в много къси разклонения на Git във формата "tags / name". Ще искате да конвертирате всички тези клонове в действителни Git тагове, като използвате:

 cd ~/new-bare.git git for-each-ref --format='%(refname)' refs/heads/tags | cut -d / -f 4 | while read ref do git tag "$ref" "refs/heads/tags/$ref"; git branch -D "tags/$ref"; done 

Тази стъпка ще отнеме малко информация :-) Но, не се притеснявайте; вашата Unix обвивка ще предостави> вторичен ред за извънредно дългата команда, която започва с git for-each-ref.

6
22 июля '14 в 7:36 2014-07-22 07:36 отговорът е даден от Valarpirai на 22 юли 14 в 7:36 2014-07-22 07:36

Сега GitHub има функция за импортиране от SVN хранилището . Никога не съм го опитвал.

5
21 сент. отговорът е даден webmat 21 sep . 2008-09-21 05:15 '08 в 5:15 am 2008-09-21 05:15

Можем да използваме командите git svn clone както е показано по-долу.

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

Екипът отгоре ще създаде авторски файл от SVN.

  • svn log --stop-on-copy <SVN_URL>

Горната команда ще ви даде първия номер на версията, когато вашият SVN проект е създаден.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Горната команда ще създаде хранилище Git в локален режим.

Проблемът е, че той няма да преобразува клонове и маркери за push. Ще трябва да го направите ръчно. Например, по-долу за клонове:

 $ git remote add origin https://github.com/pankaj0323/JDProjects.git $ git branch -a * master remotes/origin/MyDevBranch remotes/origin/tags/MyDevBranch-1.0 remotes/origin/trunk $$ git checkout -b MyDevBranch origin/MyDevBranch Branch MyDevBranch set up to track remote branch MyDevBranch from origin. Switched to a new branch 'MyDevBranch' $ git branch -a * MyDevBranch master remotes/origin/MyDevBranch remotes/origin/tags/MyDevBranch-1.0 remotes/origin/trunk $ 

За маркери:

 $git checkout origin/tags/MyDevBranch-1.0 Note: checking out 'origin/tags/MyDevBranch-1.0'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b new_branch_name HEAD is now at 3041d81... Creating a tag $ git branch -a * (detached from origin/tags/MyDevBranch-1.0) MyDevBranch master remotes/origin/MyDevBranch remotes/origin/tags/MyDevBranch-1.0 remotes/origin/trunk $ git tag -a MyDevBranch-1.0 -m "creating tag" $git tag MyDevBranch-1.0 $