it-swarm-eu.dev

Jak mohu migrovat úložiště SVN s historií do nového úložiště Git?

Četl jsem manuál Git, FAQ, Git - SVN crash kurz, atd. A všichni to vysvětlují a to, ale nikde nemůžete najít jednoduchý návod jako:

SVN repozitář v: svn://myserver/path/to/svn/repos

Repozitář Git v: 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

Nečekám, že to bude tak jednoduché, a nečekám, že to bude jediný příkaz. Ale očekávám, že se nebude snažit nic vysvětlovat - jen říci, jaké kroky by měl tento příklad vzít.

1453
Milan Babuškov

Magie:

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

Git a SVN fungují velmi odlišně. Musíte se naučit Git, a pokud chcete sledovat změny z SVN proti proudu, musíte se naučit git-svn. Manuální stránka git-svn má dobrou ukázkovou sekci:

$ git svn --help
513
jfm3

Vytvořte soubor uživatelů (tj. users.txt) pro mapování uživatelů SVN do Gitu:

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

Tuto linii můžete použít k vytvoření šablony ze stávajícího úložiště SVN:

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

SVN se zastaví, pokud najde chybějícího uživatele SVN, který není v souboru. Ale pak můžete aktualizovat soubor a pick-up, kde jste přestali.

Nyní vytáhněte data SVN z úložiště:

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

Tento příkaz vytvoří nové úložiště Git v souboru dest_dir-tmp a začne stahovat úložiště SVN. Všimněte si, že příznak "--stdlayout" znamená, že máte společné rozložení SVN "trunk /, branches /, tags /". Pokud se rozložení liší, obraťte se na volby --tags, --branches, --trunk (obecně git svn help).

Všechny běžné protokoly jsou povoleny: svn://, http://, https://. Adresa URL by měla cílit na základní úložiště, něco jako http://svn.mycompany.com/myrepo/repository . To musí ne zahrnovat /trunk, /tag nebo /branches.

Všimněte si, že po provedení tohoto příkazu to velmi často vypadá, že operace je "zavěšená/zamrzlá", a je zcela normální, že ji lze po inicializaci nového úložiště zaseknout na dlouhou dobu. Nakonec se pak zobrazí zprávy protokolu, které indikují, že migrují.

Všimněte si také, že pokud vynecháte příznak --no-metadata, Git přidá zprávu o odpovídající revizi SVN do zprávy o potvrzení (tj. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Pokud jméno uživatele nebylo nalezeno, aktualizujte soubor users.txt a poté:

cd dest_dir-tmp
git svn fetch

Pokud budete mít velký projekt, budete muset tento poslední příkaz několikrát opakovat, dokud nebudou všechny příkazy Subversion načteny:

git svn fetch

Po dokončení bude Git kontrolovat SVN trunk do nové větve. Ostatní větve jsou nastaveny jako dálkové ovladače. Ostatní větve SVN můžete zobrazit pomocí:

git branch -r

Chcete-li ve svém úložišti ponechat další vzdálené pobočky, chcete pro každou z nich ručně vytvořit lokální pobočku. (Přeskočit trunk/master.) Pokud to neuděláte, větve nebudou v posledním kroku klonovány.

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

Značky jsou importovány jako větve. Musíte vytvořit lokální pobočku, vytvořit značku a odstranit pobočku tak, aby se jednalo o značky v Gitu. Chcete-li to provést pomocí značky „v1“:

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

Klonujte úložiště GIT-SVN do čistého úložiště Git:

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

Místní pobočky, které jste vytvořili dříve ze vzdálených poboček, budou zkopírovány jako vzdálené pobočky do nového klonovaného úložiště. (Skip trunk/master.) Pro každou pobočku, kterou chcete zachovat:

git checkout -b local_branch Origin/remote_branch

Nakonec odeberte vzdálený ovladač z čistého úložiště Git, který ukazuje na nyní smazané dočasné úložiště:

git remote rm Origin
1512
cmcginty

Čistá migrace úložiště Subversion do úložiště Git . Nejdříve je třeba vytvořit soubor, který mapuje vaše autorizace Subversion, kteří mají svolení, na Git commiters, řekněme ~/authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

Data Subversion pak můžete stáhnout do úložiště Git:

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

Pokud používáte počítač Mac, můžete získat git-svn z MacPorts instalací git-core +svn.

Pokud je vaše úložiště Subversion na stejném počítači jako požadované úložiště git, můžete tuto syntaxi použít pro krok init, jinak všechny stejné:

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

Použil jsem skript svn2git a funguje jako kouzlo.

69

Doporučuji, aby se pohodlně s Git před pokusem o použití git-svn neustále, tj. Udržování SVN jako centralizované repo a pomocí Git lokálně.

Pro jednoduchou migraci se všemi historiemi je zde několik jednoduchých kroků:

Inicializujte místní repo:

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

Označte, jak daleko chcete začít importovat revize:

git svn fetch -r42

(nebo jen "git svn fetch" pro všechny revs)

Od té doby vlastně přinesete všechno:

git svn rebase

Výsledek importu můžete zkontrolovat pomocí Gitk. Nejsem si jistý, jestli to funguje na Windows, funguje to na OSX a Linuxu:

gitk

Pokud máte lokální repo SVN repo klon, možná budete chtít, abyste jej pro usnadnění spolupráce posunuli do centralizovaného repo Git.

Nejprve vytvořte svůj prázdný vzdálený repo (možná na GitHub ?):

git remote add Origin [email protected]:user/project-name.git

Potom, případně, synchronizujte hlavní pobočku tak, aby operace pull automaticky spojila vzdáleného mastera s vaším lokálním masterem, když obě obsahují nové věci:

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

Poté budete mít zájem vyzkoušet si vlastní nástroj git_remote_branch, který pomáhá řešit vzdálené pobočky:

První vysvětlující příspěvek: " Git vzdálené pobočky "

Sledování nejnovější verze: " Čas pro spolupráci s git_remote_branch "

57
webmat

Existuje nové řešení pro hladkou migraci ze Subversion na Git (nebo pro použití současně): SubGit .

Pracuji na tomto projektu sám. V našich repozitářích používáme SubGit - někteří moji spoluhráči používají Git a nějakou Subversion a zatím to funguje velmi dobře.

Chcete-li přejít ze Subversion na Git pomocí SubGit, musíte spustit:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Poté budete mít repozitář Git ve svn_repos/.git a můžete jej klonovat, nebo jednoduše pokračovat v používání Subversion a tohoto nového úložiště Git společně: SubGit zajistí, že oba budou vždy synchronizovány.

V případě, že vaše úložiště Subversion obsahuje více projektů, bude v adresáři svn_repos/git vytvořeno více úložišť Git. Chcete-li před spuštěním přizpůsobit překlad, proveďte následující:

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

S SubGit můžete migrovat na čistý Git (ne git-svn) a začít jej používat, zatímco Subversion budete udržovat tak dlouho, jak budete potřebovat (například pro vaše již nakonfigurované nástroje pro sestavení).

Snad to pomůže!

30
Alexander Kitaev

Viz oficiální git-svn manpage . Konkrétně se podívejte do části Základní příklady:

Sledování a přispívání k celému projektu řízenému Subversion (doplněnému o trunk, tagy a větve):

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

SubGit (vs modrá obrazovka smrti)

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

Je to všechno.

+ Chcete-li aktualizovat z SVN, úložiště Git vytvořené prvním příkazem.

subgit import  directory/path/Local.git.Repo

Použil jsem způsob, jak okamžitě přejít na Git pro obrovské úložiště.
Samozřejmě potřebujete nějakou přípravu.
Ale nemusíte zastavit vývojový proces.

Tady je moje cesta.

Moje řešení vypadá takto:

  • Migrace SVN do úložiště Git
  • Aktualizujte úložiště Git těsně před přechodem týmu na .

Migrace zabere spoustu času pro velké úložiště SVN.
Ale aktualizace dokončené migrace jen několik sekund.

Samozřejmě používám SubGit , mami. git-svn mi dělá modrá obrazovka smrti . Jen neustále. A git-svn mě nudí s Git's " název souboru příliš dlouhý " fatální chyba.

KROKY

1. Stáhnout subGit

2. Připravte si příkazy pro migraci a aktualizaci.

Řekněme, že to uděláme pro Windows (je to triviální port pro Linux).
V instalaci SubGit bin (subgit-2.X.X bin) vytvořte dva soubory .bat.

Obsah souboru/příkazu pro migraci:

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

Příkaz "start" je zde volitelný (Windows). To umožní vidět chyby na startu a opustil Shell otevřený po dokončení SubGit.

Můžete sem přidat další parametry podobné git-svn . Používám pouze - default-domain myCompanyDomain.com k opravě domény e-mailové adresy autorů SVN.
Mám standardní strukturu SVN repozitáře (trunk/branches/tags) a neměli jsme problémy s "mapováním autorů". Takže už nic nedělám.

(Pokud chcete migrovat značky, jako jsou větve nebo SVN má více složek větví/značek, můžete zvážit použití podrobnějšího SubGit přístup )

Tip 1 : Použijte --minimal-revision YourSvnRevNumber k rychlému zobrazení toho, jak věci vypadají (nějaký druh ladění). Zvláště užitečné je vidět vyřešená jména autorů nebo e-maily.
Nebo omezení hloubky historie migrace.

Tip 2 : Migrace může být přerušena (Ctrl + C) a obnovena spuštěním dalšího aktualizačního příkazu/souboru.
Nedoporučuji to dělat pro velké repozitáře. Dostal jsem "Mimo paměť Java + Windows výjimka".

Tip 3 : Lepší je vytvořit kopii výsledného holého úložiště.

Obsah souboru/příkazu pro aktualizaci:

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

Můžete ji spouštět kdykoli, když chcete získat poslední tým, který se zaváže do vašeho úložiště Git.

Varování Nedotýkejte se vašeho nahého úložiště (například vytváření poboček).
Uděláte další závažnou chybu:

Neopravitelná chyba: jsou synchronizovány a nelze je synchronizovat ... Přeložení revizí Subversion do Gitu se zaváže ...

3. Spusťte první příkaz/soubor. Bude to trvat velký čas pro velké úložiště. 30 hodin pro mé pokorné úložiště.

Je to všechno.
Své úložiště Git můžete aktualizovat z SVN kdykoliv a kolikrát spuštěním druhého souboru/příkazu. A před přepnutím svého vývojového týmu na Git.
Bude to trvat jen několik sekund.



Je tu ještě jeden užitečný úkol.

Přepněte místní úložiště Git do vzdáleného úložiště Git

Je to váš případ? Pokračujme.

  1. Nakonfigurujte dálkové ovladače

Běh:

$ git remote add Origin url://your/repo.git
  1. Připravte se na počáteční odeslání svého obrovského lokálního úložiště Git do vzdáleného úložiště

Ve výchozím nastavení nemůže váš Git posílat velké kousky. fatální: Vzdálený konec nečekaně zavěsil

Pojďme na to běžet:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, atd.

Opravte místní potíže s certifikátem . Pokud váš server git používá poškozený certifikát.

Zakázala jsem certifikáty .

Také váš server Git může mít omezení počtu požadavků, které je třeba opravit .

  1. Push all migration do vzdáleného Git repozitáře týmu.

Běh s místním Gitem:

git Push Origin --mirror

( git Push Origin '*: *' pro staré verze Git)

Pokud se vám zobrazí následující: chyba: nelze spustit git: Žádný takový soubor nebo adresář ... Pro mě úplná rekreace mého úložiště tuto chybu řeší ( 30 hodin). Můžete vyzkoušet další příkazy

git Push Origin --all
git Push Origin --tags

Nebo zkuste přeinstalovat Git ( pro mě zbytečné ). Nebo můžete vytvořit větve ze všech značek a Push. Nebo, nebo, nebo ...

13
it3xl

reposurgeon

Pro komplikované případy je nástrojem výběru reposurgeon Eric S. Raymond . Kromě SVN podporuje mnoho dalších systémů pro správu verzí pomocí formátu fast-export a také CVS . Autor uvádí úspěšné konverze starých repozitářů jako Emacs a FreeBSD .

Nástroj zřejmě se zaměřuje na téměř dokonalou konverzi (např. Převod vlastností SVN svn:ignore na soubory .gitignore) i pro obtížná rozvržení úložiště s dlouhou historií. V mnoha případech může být snazší použití jiných nástrojů.

Než se pustíte do dokumentace příkazového řádku reposurgeon, přečtěte si vynikající průvodce migrací DVCS který postupuje krok za krokem procesu konverze.

9
krlmlr

Tento průvodce na webových stránkách společnosti atlassian je jedním z nejlepších, které jsem našel:

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

Tento nástroj - https://bitbucket.org/atlassian/svn-migration-scripts - je také velmi užitečný pro generování vašich autorů.txt.

7
Andrew B

Musíte nainstalovat

git
git-svn

Zkopírováno z tohoto odkazu http://john.albin.net/git/convert-Subversion-to-git .

1. Načíst seznam všech zadavatelů Subversion

Subversion jednoduše vypíše uživatelské jméno pro každé potvrzení. Závazky společnosti Git mají mnohem bohatší data, ale v nejjednodušším případě musí autor pro potvrzení obsahovat jméno a e-mail. Ve výchozím nastavení bude nástroj git-svn zobrazovat pouze uživatelské jméno SVN v polích autor a e-mail. Ale s trochou práce můžete vytvořit seznam všech uživatelů SVN a jejich odpovídající jméno Git a e-maily. Tento seznam může git-svn použít k transformaci jednoduchých svn uživatelských jmen do správných Git komisařů.

V kořenovém adresáři místní kontroly Subversion spusťte tento příkaz:

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

To uchopí všechny logovací zprávy, vytrhne uživatelská jména, odstraní všechna duplicitní uživatelská jména, roztřídí uživatelská jména a umístí je do souboru autorů-transform.txt. Nyní upravte každý řádek v souboru. Převést například:

jwilkins = jwilkins <jwilkins>

do tohoto:

jwilkins = John Albin Wilkins <[email protected]>

2. Klonování úložiště Subversion pomocí git-svn

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

Tím se provede standardní transformace git-svn (pomocí souboru author-transform.txt, který jste vytvořili v kroku 1) a umístěte úložiště git do složky „~/temp“ v domovském adresáři.

3. Převést vlastnosti svn: ignore na .gitignore

Pokud váš svn repo používal vlastnosti svn: ignore, můžete jej snadno převést na soubor .gitignore pomocí:

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

4. Stiskněte repozitář do holého úložiště git

Nejdříve vytvořte nahé úložiště a jeho výchozí větev se shoduje se jménem větve svn.

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

Poté stiskněte temp repository do nového úložiště.

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

Nyní můžete bezpečně smazat úložiště ~/temp.

5. Přejmenovat větev „trunk“ na „master“

Vaše hlavní vývojová větev bude pojmenována „trunk“, která odpovídá názvu, který byl v Subversion. Přejete si jej přejmenovat na standardní „hlavní“ pobočku společnosti Git pomocí:

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

6. Vyčistěte větve a značky

git-svn provede všechny tagy Subverzí do velmi krátkých větví v Gitu ve tvaru „tags/name“. Budete chtít převést všechny tyto větve do skutečných značek Git pomocí:

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

Tento krok bude trvat trochu psaní. :-) Ale neboj se; váš unixový shell poskytne> sekundární příkaz pro extra dlouhý příkaz, který začíná příkazem git for-each-ref.

7
Valarpirai

Poněkud rozšířená odpověď používající jen git, SVN a bash. Zahrnuje kroky pro úložiště SVN, které nepoužívají konvenční rozložení s rozvržením adresáře trunk/branches/tags (SVN nedělá absolutně nic, co by tento druh rozložení vynucovalo).

Nejprve použijte tento bash skript ke skenování repo SVN pro různé lidi, kteří přispěli a vytvořili šablonu pro soubor mapování:

#!/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 <[email protected]>";
done

Použijte toto k vytvoření souboru authors, ve kterém mapujete svn uživatelská jména na uživatelská jména a e-maily, které nastavili vaši vývojáři pomocí git config properties user.name a user.email (všimněte si, že pro službu jako GitHub stačí mít odpovídající e-mail).

Pak mají git svn klonovat úložiště svn do repozitáře git a řekněte mu o mapování:

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

To může trvat neuvěřitelně dlouho, protože git svn bude individuálně kontrolovat každou revizi pro každou značku nebo větev, která existuje. (Všimněte si, že tagy v SVN jsou jen opravdu větve, takže skončí jako takové v Gitu). Můžete to urychlit odstraněním starých značek a větví v SVN, které nepotřebujete.

Spuštění na serveru ve stejné síti nebo na stejném serveru to může také urychlit. Také, pokud z nějakého důvodu tento proces přerušíte můžete obnovit jej pomocí

git svn rebase --continue

V mnoha případech jste tady. Pokud má váš repozitář SVN netradiční uspořádání, ve kterém máte jednoduše adresář v SVN, který chcete umístit do větve git, můžete provést další kroky.

Nejjednodušší je vytvořit nový SVN repo na vašem serveru, který bude následovat konvenci a použít svn copy pro vložení vašeho adresáře do kufru nebo pobočky. To může být jediný způsob, pokud je váš adresář úplně v kořenovém adresáři repo, když jsem naposledy vyzkoušel tento git svn prostě odmítl provést pokladnu.

Můžete to také udělat pomocí git. Pro git svn clone jednoduše použijte adresář, který chcete umístit do větve git.

Po běhu

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

Všimněte si, že to vyžaduje Git 1.7 nebo vyšší.

6
thoutbeckers

GitHub má nyní funkci import z SVN repozitáře . Nikdy jsem to nezkoušela.

6
webmat

Poslal jsem krok za krokem průvodce ( zde ) převést svn in na git včetně převodu svn tagy do git tagy a svn větví do git poboček.

Krátká verze:

1) klonujte svn ze specifického čísla revize. (číslo revize musí být nejstarší, kterou chcete migrovat)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) načíst svn data. Tento krok je ten, který zabírá nejvíce času.

cd gitreponame
git svn fetch

opakujte git svn fetch, dokud nedokončí bez chyby

3) dostat hlavní větve aktualizovány

git svn rebase

4) Vytvořte místní pobočky z větví svn zkopírováním odkazů

cp .git/refs/remotes/Origin/* .git/refs/heads/

5) převést svn tagy do tagů git

git for-each-ref refs/remotes/Origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/Origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Umístěte repozitář na lepší místo jako github

git remotes add newrepo [email protected]:aUser/aProjectName.git
git Push newrepo refs/heads/*
git Push --tags newrepo

Pokud chcete více informací, přečtěte si můj post nebo se mě zeptejte.

5

Můžeme použít příkazy git svn clone níže.

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

Výše uvedený příkaz vytvoří soubor autorů ze SVN.

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

Příkaz Výše ​​vám dá první číslo revize, když byl vytvořen projekt SVN.

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

Příkaz Above vytvoří lokální úložiště Git.

Problém je, že nebude konvertovat větve a značky na Push. Budete muset udělat ručně. Například níže pro pobočky:

$ 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
$

Pro značky:

$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
$

Nyní stiskněte hlavní, větve a značky do vzdáleného úložiště git.

$ git Push Origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

nástroj svn2git

svn2git utility odstraní ruční úsilí s větvemi a tagy.

Nainstalujte ji pomocí příkazu Sudo gem install svn2git. Po tomto spuštění pod příkazem.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Nyní můžete seznam větví, značek a Push je snadno zobrazit.

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git Push Origin master MyDevBranch MyDevBranch-1.0

Představte si, že máte 20 poboček a značek, zřejmě svn2git vám ušetří spoustu času a to je důvod, proč se mi líbí lépe než nativní příkazy. Je to pěkný obal kolem nativního příkazu git svn clone.

Úplný příklad naleznete v mé položce blogu .

5
Pankaj

To dělá TortoiseGit. viz tento příspěvek na blogu: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-používání-to-jednotlivci

Jo, vím, že odpovědi s odkazy nejsou nádherné, ale je to řešení, co?

4
CAD bloke

Pro GitLab uživatelé vytvořili přehled o tom, jak jsem zde migroval ze SVN:

https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af

Kroky migrace z SVN na GitLab

Založit

  • SVN je hostováno v svn.domain.com.au.
  • SVN je přístupné přes http(jiné protokoly by měly fungovat).
  • GitLab je hostován v git.domain.com.au a:
    • Skupina je vytvořena s jmenným prostorem dev-team.
    • Je vytvořen alespoň jeden uživatelský účet, přidán do skupiny a má k dispozici klíč SSH pro účet používaný pro migraci (test pomocí ssh [email protected]).
    • Projekt favourite-project je vytvořen v oboru názvů dev-team.
  • Soubor users.txt obsahuje příslušné údaje o uživateli, jeden uživatel na řádek formuláře username = First Last <[email protected]>, kde usernameje uživatelské jméno zadané v protokolech SVN. (Podrobnosti viz první odkaz v sekci Odkazy), zejména odpověď uživatele Casey.

Verze

  • Verze Subversion 1.6.17 (r1128011)
  • verze 1.9.1
  • GitLab verze 7.2.1 ff1633f
  • Ubuntu server 14.04

Příkazy

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git Push --set-upstream gitlab master

A je to! Znovu načtěte stránku projektu do webového uživatelského rozhraní GitLab a uvidíte všechny seznamy a seznamy.

Poznámky

  • Pokud jsou neznámí uživatelé, příkaz git svn clone se zastaví, v takovém případě bude aktualizace users.txt, cd favourite-project a git svn fetch pokračovat od místa, kde se zastavila.
  • Vyžaduje se standardní trunkname __-tagsname __-brancheslayout pro SVN repozitář.
  • URL SVN dané příkazu git svn clone se zastaví na úrovni bezprostředně nad trunk/, tags/ a branches/.
  • Příkaz git svn clone produkuje hodně výstupu, včetně některých varování nahoře; Ignoroval jsem varování.
3
leftclickben

Pokud používáte SourceTree, můžete to udělat přímo z aplikace. Přejděte na Soubor -> Nový/Klon a proveďte následující:

  1. Zadejte adresu URL vzdáleného SVN jako "Zdrojová cesta/URL".
  2. Po zobrazení výzvy zadejte svá pověření.
  3. Zadejte umístění lokální složky jako "Cílová cesta".
  4. Dejte mu jméno.
  5. V pokročilých možnostech vyberte "Git" z rozevíracího seznamu "Vytvořit lokální úložiště typu".
  6. Volitelně můžete zadat revizi, ze které chcete klonovat.
  7. Hit klon.

Otevřete repo v SourceTree a uvidíte, že vaše zprávy byly také přeneseny.

Nyní přejděte do Repository -> Repository Settings a přidejte nové detaily vzdáleného repo. Pokud chcete, smažte dálkový ovladač SVN (provedl jsem to prostřednictvím možnosti „Upravit konfigurační soubor“.

Pokud jste připraveni a kód volně kódovat, stiskněte kód do nového vzdáleného repo.

3
Craig Myles

Velmi doporučuji tuto krátkou sérii screencastů právě jsem objevil. Autor vás provede základními operacemi a předvede některá pokročilejší použití.

3
ripper234

Zde je jednoduchý skript Shell bez závislostí, který převede jeden nebo více SVN úložišť na git a Push to GitHub.

https://Gist.github.com/NathanSweet/7327535

V asi 30 řádcích skriptu: klony pomocí git SVN, vytvoří soubor .gitignore z vlastností SVN :: ignore, vloží se do holého úložiště git, přejmenuje kmen SVN na master, převede tagy SVN na tagy git a posouvá je do GitHub při zachování tagů.

Šel jsem hodně bolesti, abych přesunul tucet SVN repozitářů z Google Code do GitHubu. Nepomohlo mi to, že jsem použil Windows. Ruby byla na mém starém debianovém boxu nejrůznějšími věcmi. Jiná řešení nefungovala s cestami Cygwin. I když jsem něco fungoval, nemohl jsem přijít na to, jak dostat tagy na GitHub (tajemství je --follow-tags).

Nakonec jsem dala dohromady dva krátké a jednoduché skripty, spojené výše, a funguje to skvěle. Řešení nemusí být o nic složitější!

2
NateS

Jako další stranou, příkaz git-stash je darem z nebes, když se pokoušíte git-svn dcommits.

Typický proces:

  1. nastavit git repo
  2. udělat nějakou práci na různých souborech
  3. rozhodnout se zkontrolovat některé z práce, pomocí git
  4. rozhodnout se svn-dcommit
  5. dostat obávaný "nemůže spáchat s špinavý index" chyba.

Řešení (vyžaduje git 1.5.3+):

git stash; git svn dcommit ; git stash apply
2
Gregg Lind

Jsem na počítači se systémem Windows a udělal jsem malou šarži, abych převedl repo SVN s historií (ale bez větví) na repo GIT, když jsem zavolal

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Možná ji může použít kdokoli. Vytvoří TMP-složku, která kontroluje SVN repo tam pomocí git a přidává nový Origin a tlačí ho ... a znovu smaže složku.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add Origin %TO% 
git Push --set-upstream Origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Stále potřebujete uživatele.txt s uživatelskými mapováními

User1 = User One <[email protected]>
2
cljk

Chtěl jsem jen přidat svůj příspěvek komunitě Git. Napsal jsem jednoduchý bash skript, který automatizuje plný import. Na rozdíl od jiných migračních nástrojů se tento nástroj opírá o nativní git místo jGit. Tento nástroj také podporuje repozitáře s velkou historií revizí nebo velkými bloky. Je k dispozici prostřednictvím githubu:

https://github.com/onepremise/SGMS

Tento skript převede projekty uložené v SVN v následujícím formátu:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Tento systém je také populární a podporovaný také:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Každý projekt bude synchronizován podle názvu projektu:

Ex: ./migration https://svnurl.com/basepath project1

Chcete-li převést celé repo, použijte následující syntaxi:

Ex: ./migration https://svnurl.com/basepath .
1
Jason Huntley

K dosažení tohoto cíle existují různé metody. Zkoušel jsem některé z nich a zjistil, opravdu fungující jeden s jen git a svn nainstalován na operačním systému Windows.

Předpoklady:

  1. git na Windows (jsem použil tento) https://git-scm.com/
  2. svn s nainstalovanými nástroji konzoly (používal jsem želvu svn)
  3. Soubor výpisu úložiště SVN. svnadmin dump /path/to/repository > repo_name.svn_dump

Kroky k dosažení konečného cíle (přesunout všechny úložiště s historií na git, nejprve lokální git, pak vzdálené)

  1. Vytvořit prázdný repozitář (pomocí nástrojů konzoly nebo tortoiseSVN) v adresáři REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, dumpfile.dump do REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Počkejte na tuto operaci, může být dlouhá

  3. Tento příkaz je tichý, takže otevřete druhé cmd okno: svnserve -d -R --root REPO_NAME_FOLDER Proč ne jen použít soubor: /// ......? Protože další příkaz selže s Unable to open ... to URL:, díky odpovědi https://stackoverflow.com/a/6300968/4953065

  4. Vytvořit novou složku SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn: // localhost/Počkejte na tuto operaci.

Konečně, co máme?

Podívejme se na náš lokální repozitář:

git log

Podívejte se na vaše předchozí provize? Pokud ano - dobře

Takže nyní máte plně funkční lokální úložiště git s vašimi zdroji a starou historií. Pokud ji chcete přesunout na některý server, použijte následující příkazy:

git remote add Origin https://fullurlpathtoyourrepo/reponame.git
git Push -u Origin --all # pushes up the repo and its refs for the first time
git Push -u Origin --tags # pushes up any tags

V mém případě, já dont potřebovat značky příkaz způsobit moje repo dont mít tagy.

Hodně štěstí!

0
Ruslan Makrenko

GitHub má dovozce. Po vytvoření úložiště můžete importovat z existujícího úložiště prostřednictvím adresy URL. Bude požádat o vaše pověření, pokud je to vhodné a jít odtamtud.

Jak to běží, najde autory a můžete je jednoduše namapovat na uživatele GitHubu.

Použil jsem to pro několik repozitářů teď, a je to docela přesné a mnohem rychlejší taky! Trvalo 10 minut pro repozitář s ~ 4000 provizemi a poté, co mi to trvalo čtyři dny!

0
Josh Benson

Efektivně pomocí Git s Subversionje jemný úvod do git-svn. Pro existující SVN repozitáře, git-svn dělá to super snadné. Pokud začínáte nový repozitář, je mnohem jednodušší nejprve vytvořit prázdný SVN repozitář a pak importovat pomocí git-svn, než je v opačném směru. Vytvoření nového repozitáře Git pak importování do SVN může být provedeno, ale je to trochu bolestivé, zejména pokud jste nový Git a doufáte, že zachováte historii spáchání.

0
burkestar

Několik odpovědí zde odkazuje na https://github.com/nirvdrum/svn2git , ale u velkých repozitářů to může být pomalé. Zkoušel jsem použít https://github.com/svn-all-fast-export/svn2git místo toho, což je nástroj s přesně stejným názvem, ale byl použit k migraci KDE z SVN do Gitu.

Mírně více práce, než aby to nastavil, ale když jsem udělal konverzi sám pro mě trvalo minuty, kdy ostatní skript strávil hodiny.

0
Zitrax

Stáhněte si instalační program Ruby pro Windows a nainstalujte s ním nejnovější verzi. Přidat Ruby spustitelné soubory do vaší cesty.

  • Nainstalujte svn2git
  • Nabídka Start -> Všechny programy -> Ruby -> Spusťte příkaz Prompt with Ruby
  • Potom zadejte „gem install svn2git“ a zadejte

    Migrace repozitáře Subversion

  • Otevřete příkazový řádek Ruby a přejděte do adresáře, kam mají být soubory přeneseny

    Pak svn2git http: // [doména název]/svn/[kořen úložiště]

  • Přechod projektu do Gitu může trvat několik hodin, závisí na velikosti kódu projektu.

  • Tento hlavní krok pomáhá při vytváření struktury úložiště Git, jak je uvedeno níže.

    SVN (/ Project_components) trunk -> Git master SVN (/ Project_components) větve -> Git větve SVN (/ Project_components) tagy -> Git tagy

Vytvořte vzdálené úložiště a stiskněte změny.

0
Nanda

Použil jsem následující skript ke čtení textového souboru, který má seznam všech mých SVN repozitářů a převést je na Git, a později použít git clone --bare převést na holý Git repozitář:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt má formát:

repo1_name
repo2_name

A user.txt má formát:

(no author) = Prince Rogers <[email protected]>

www-data je uživatel webového serveru Apache a pro Push Push přes HTTP je potřeba povolení.

0
Pedro Vicente

Převod svn submodulu/složky 'MyModule' na git s historií bez tagů a větví.

Chcete-li zachovat seznam svn ignore, použijte výše uvedené poznámky po kroku 1

0
PShetty