Come faccio a eseguire la migrazione di un repository SVN con la storia di un nuovo repository Git?

StackOverflow https://stackoverflow.com/questions/79165

Domanda

Ho letto il manuale di Git, FAQ, Git - SVN corso di arresto, ecc.e tutti a spiegare questo e quello, ma nulla si può trovare una semplice istruzione del tipo:

Repository SVN in: svn://myserver/path/to/svn/repos

Git repository: 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

Non mi aspetto che semplice, e non mi aspetto che sia un singolo comando.Ma io mi aspetto di non cercare di spiegare nulla, solo per dire che misure di questo esempio.

È stato utile?

Soluzione

Magia:

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

Git e SVN operare in modo molto diverso.Hai bisogno di imparare Git, e se si desidera tenere traccia delle modifiche da SVN a monte, è necessario imparare git-svn.Il git-svn pagina man ha una buona sezione esempi:

$ git svn --help

Altri suggerimenti

Creare un file utenti (es. users.txt) per la mappatura SVN agli utenti di Git:

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

È possibile utilizzare questa one-liner per costruire un modello esistente repository SVN:

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

SVN si ferma se trova una mancanti SVN utente non nel file.Ma dopo di che è possibile aggiornare il file e pick-up dove avete lasciato.

Ora tirare la SVN dati dall'archivio:

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

Questo comando crea un nuovo repository Git in dest_dir-tmp e iniziare a tirare il repository SVN.Nota che "--stdlayout" bandiera implica che si hanno in comune il "tronco/ rami/ tag/" SVN layout.Se il formato è diverso, è necessario avere familiarità con --tags, --branches, --trunk opzioni (in generale git svn help).

Tutti i protocolli più comuni sono: svn://, http://, https://.L'URL di destinazione la base repository, qualcosa di simile http://svn.mycompany.com/myrepo/repository.Che deve non includono /trunk, /tag o /branches.

Si noti che dopo l'esecuzione di questo comando è molto spesso sembra che l'operazione è "appeso/congelato", ed è abbastanza normale che sia, possono essere bloccati per un lungo periodo di tempo dopo l'inizializzazione del nuovo repository.Alla fine si vedrà, quindi, i messaggi di log che indica che è in fase di migrazione.

Si noti inoltre che se si omette la --no-metadata bandiera, Git aggiungere informazioni circa la corrispondente revisione SVN per il messaggio di commit (es. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Se il nome utente non viene trovato, aggiornare il users.txt file:

cd dest_dir-tmp
git svn fetch

Si potrebbe ripetere l'ultimo comando più volte, se si dispone di un grande progetto, fino a quando tutti i commit su Subversion sono stati recuperati:

git svn fetch

Quando completato, Git checkout SVN trunk in un nuovo ramo.Altre filiali sono il programma di installazione come telecomandi.È possibile visualizzare altri SVN rami con:

git branch -r

Se si desidera mantenere a distanza i rami in archivio, si desidera creare un ramo locale per ogni mano.(Saltare tronco/master.) Se non fate questo, i rami non avere clonato nel passaggio finale.

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

I tag vengono importati come rami.È necessario creare un ramo locale, fare un tag ed eliminare il ramo e li hanno come tag in Git.Per farlo con tag "v1":

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

Clone GIT-SVN repository in un ambiente pulito repository Git:

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

Le sedi locali, che si è creato in precedenza da remoto rami sono stati copiati remoto rami nel nuovo repository clonato.(Saltare tronco/master.) Per ogni ramo che si desidera conservare:

git checkout -b local_branch origin/remote_branch

Infine, rimuovere il telecomando del tuo pulita repository Git che punti all'ora eliminato temporanea repository:

git remote rm origin

Correttamente la Migrazione del Repository di Subversion in un Repository Git.Innanzitutto, è necessario creare un file che esegue il mapping di Subversion commettere i nomi degli autori di Git commiters, dire ~/authors.txt:

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

Quindi è possibile scaricare la Sovversione dei dati in un repository Git:

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

Se siete su un Mac, è possibile ottenere git-svn da MacPorts da installare git-core +svn.

Se il repository subversion è sulla stessa macchina desiderata repository git, quindi è possibile utilizzare questa sintassi per l'init passo, altrimenti tutti lo stesso:

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

Ho usato il svn2git script e funziona come un fascino.

Io suggerisco di prendere confidenza con Git prima di tentare di usare git-svn costantemente, cioètalmente semplice mantenere aggiornati i SVN come il centralizzata repo e l'utilizzo di Git locale.

Tuttavia, per una semplice migrazione, con tutta la storia, qui ci sono alcuni semplici passaggi:

Inizializzare il repository locale:

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

Segno di quanto volete per avviare l'importazione revisioni:

git svn fetch -r42

(o semplicemente "git svn fetch" per tutti i giri)

Effettivamente recuperare tutto da allora:

git svn rebase

Si può controllare il risultato dell'importazione con Gitk.Non sono sicuro se questo funziona su Windows, funziona su OSX e Linux:

gitk

Quando hai la tua repo SVN clonato localmente, si potrebbe voler spingere centralizzato, repo Git per facilitare la collaborazione.

Prima di creare il vuoto remoto repo (forse GitHub?):

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

Quindi, facoltativamente sincronizzare il ramo principale in modo che il pull operazione unirà automaticamente il telecomando master con il tuo master, quando entrambi contengono cose nuove:

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

Dopo di che, si può essere interessati a provare il mio molto proprio git_remote_branch strumento, che consente di trattare con telecomando rami:

Primo post esplicativo:"Git remote rami"

Il Follow-up per la versione più recente:"Il tempo di git collaborazione con git_remote_branch"

C'è una nuova soluzione per la migrazione dal Subversion Git (o per l'utilizzo di entrambi contemporaneamente): SubGit.

Sto lavorando a questo progetto da me.Usiamo SubGit nella nostra repository, alcuni dei miei compagni di squadra utilizzare Git e alcuni Subversion e finora funziona molto bene.

Per eseguire la migrazione da Subversion Git con SubGit è necessario eseguire:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Dopo che avrai repository Git in svn_repos/.git e possono clonare, o semplicemente continuare a utilizzare Subversion e questo nuovo repository Git insieme:SubGit farà in modo che entrambi sono sempre sincronizzati.

Nel caso In cui il repository Subversion contiene più progetti, più di repository Git sarà creato in svn_repos/git directory.Per personalizzare la traduzione prima di eseguire effettuare le seguenti operazioni:

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

Con SubGit è possibile eseguire la migrazione di puro Git (non git-svn) e iniziare a usarlo, pur mantenendo Subversion come tempo necessario (per il già configurato costruire strumenti, per esempio).

Spero che questo aiuta!

Ufficiale git-svn man.In particolare, nella sezione "Esempi di Base":

Di monitoraggio e di contribuire a un intero Subversion-progetto gestito (completo con un tronco, i tag e i rami):

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

SubGit (vs Blue Screen of Death)

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

E ' tutto.

+ Per aggiornare da SVN, Git repository creato il primo comando.

subgit import  directory/path/Local.git.Repo

Ho usato un modo per migrare a Git immediatamente un enorme repository.
Naturalmente, avete bisogno di un po ' di preparazione.
Ma è possibile non interrompere il processo di sviluppo, a tutti.

Qui è il mio modo.

La mia soluzione si presenta come:

  • La migrazione SVN in un repository Git
  • Aggiornare il repository Git poco prima squadra di commutazione per.

Migrazione prende un sacco di tempo per una grande repository SVN.
Ma l'aggiornamento della migrazione completata in pochi secondi.

Ovviamente sto usando SubGit, mama.git-svn mi fa Schermo blu della Morte.Solo costantemente.E git-svn è noioso me con Git "nome file troppo lungo"errore fatale.

PASSI

1. Scarica SubGit

2. Preparare la migrazione e l'aggiornamento dei comandi.

Diciamo che lo facciamo per Windows (è banale port per Linux).
In un SubGit di installazione bin directory (subgit-2.X.X\bin), creare due .i file bat.

Il contenuto di un file/comando per la migrazione:

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

Il comando "start" è facoltativo qui (Windows).Ti permettono di vedere errori di inizio e di sinistra una shell aperta dopo il completamento del SubGit.

Si può aggiungere qui ulteriori parametri simili a git-svn.Sto utilizzando solo --default-dominio myCompanyDomain.com per risolvere il dominio dell'indirizzo di posta elettronica della SVN autori.
Io ho la standard repository SVN struttura (tronco/rami/tag) e non abbiamo avuto problemi con gli "autori mapping".Così sto facendo più niente.

(Se si desidera eseguire la migrazione di un tag come rami o il tuo SVN hanno più filiali/tag cartelle che si possono considerare la possibilità di utilizzare il più dettagliato SubGit approccio)

Suggerimento 1:Utilizzare --minimal-revisione YourSvnRevNumber per vedere velocemente le cose come bolle fuori (una sorta di debug).Particolarmente utile è quello di vedere risolti i nomi degli autori o e-mail.
O al limite la storia della migrazione di profondità.

Suggerimento 2:La migrazione può essere interrotto (Ctrl + C) e restaurato per l'esecuzione del prossimo aggiornamento di comando/file.
Io non consiglio di fare questo per i grandi archivi.Ho ricevuto "di memoria Java+eccezione di Windows".

Suggerimento 3:Meglio creare una copia del tuo risultato bare repository.

Il contenuto di un file di comando per l'aggiornamento:

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

Si può eseguire qualsiasi numero di volte quando si desidera ottenere l'ultima squadra si impegna al proprio repository Git.

Attenzione! Non toccare nuda repository (creazione di sportelli per esempio).
Potrai prendere il successivo errore fatale:

Errori non recuperabili:non sono sincronizzati e non può essere sincronizzato ...Traduzione di Subversion revisioni Git commit...

3. Eseguito il primo comando/file.Ci vorrà moooolto tempo per una grande repository.30 ore per la mia umile repository.

E ' tutto.
Si può aggiornare il repository Git da SVN in qualsiasi momento la quantità di volte che eseguendo il secondo file/comando.E prima di passare dei team di sviluppo di Git.
Ci vorranno solo pochi secondi.



C'è un altro compito utile.

Spingere il repository locale a remoto repository Git

E ' il tuo caso?Procediamo.

  1. Configura i tuoi telecomandi

Eseguire:

$ git remote add origin url://your/repo.git
  1. Preparare l'invio iniziale del tuo enorme repository Git locale di un repository remoto

Per impostazione predefinita, il Git non è possibile inviare i pezzi grandi.fatal:L'estremo remoto riattaccato in modo imprevisto

Let's run for it:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, etc.

Risolvere il tuo locale certificato di problemi.Se il tuo git-server utilizza la rottura di un certificato.

Ho disabilitato certificati.

Anche il tuo server Git può avere un richiesta di limiti di importo che necessitano di essere corretti.

  1. Spingere tutti migrazione la squadra remoto repository Git.

Eseguire con un Git locale:

git push origin --mirror

(git push origin '*:*' per i vecchi Git versioni)

Se si ottiene il seguente: errore:non può deporre le uova git:No such file or directory...Per me, il pieno di ricreazione del mio repository risolve questo errore (30 ore).È possibile provare i seguenti comandi

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

O tenta di reinstallare Git (inutile per me).Oppure si può creare succursali tutti i tag e li spingono.O, o, o...

reposurgeon

Per i casi più complessi, reposurgeon da Eric S.Raymond è lo strumento di scelta.Oltre a SVN, supporta molti altri sistemi di controllo di versione tramite il fast-export formato, e anche CVS.L'autore del report successo di antichi archivi come Emacs e FreeBSD.

Lo strumento apparentemente mira al vicino di conversione perfetto (come la conversione di SVN s svn:ignore proprietà .gitignore file), anche per la difficile repository layout con una lunga storia.Per molti casi, altri strumenti potrebbe essere più facile da usare.

Prima di approfondire la documentazione del reposurgeon riga di comando, assicuratevi di leggere l'ottima DVC guida alla migrazione che va oltre il processo di conversione step by step.

In questa guida atlassian il sito web è uno dei migliori che ho trovato:

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

Questo strumento - https://bitbucket.org/atlassian/svn-migration-scripts - è anche molto utile per la produzione di authors.txt tra le altre cose.

Devi Installare

git
git-svn

Copiato da questo link http://john.albin.net/git/convert-subversion-to-git.

1.Recuperare un elenco di tutte Subversion committer

Subversion semplicemente elenca il nome utente per ogni commit.Git commit sono molto più ricco di dati, ma nella sua forma più semplice, il commit autore deve avere un nome ed e-mail indicato.Per impostazione predefinita, il git-svn strumento sarà solo elenco SVN nome utente sia l'autore e gli indirizzi di posta elettronica.Ma con un po ' di lavoro, è possibile creare un elenco di tutti gli utenti SVN e quali sono i loro corrispondenti Git nome ed e-mail sono.Questo elenco può essere utilizzato da git-svn per trasformare la pianura svn nomi utente in un vero e proprio Git committenza.

Dalla radice del tuo locale Subversion checkout, eseguire questo comando:

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

Che catturerà tutti i messaggi di log di cogliere fuori i nomi utente, eliminare tutti i doppi nomi, ordinare i nomi utente e inserirli in un “authors-transform.txt” file.Ora è possibile modificare ogni riga del file.Per esempio, la conversione:

jwilkins = jwilkins <jwilkins>

in questo modo:

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

2.Clonare il repository Subversion utilizzando git-svn

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

Questo farà standard git-svn trasformazione (utilizzando il authors-transform.txt file creato nel passaggio 1) e inserire il repository git in “~/temp” all'interno della vostra home directory.

3.La conversione svn:ignore proprietà .gitignore

Se la vostra repo svn era uso di svn:ignore proprietà, si può facilmente convertire questo in un .gitignore file utilizzando:

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

4.Spingere repository per un nudo repository git

Prima di tutto, creare un nudo repository e fare il suo ramo predefinito partita svn del “tronco” nome del ramo.

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

Quindi, spingere la temp repository per la nuova nuda repository.

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

Ora è possibile eliminare in modo sicuro i ~/temp repository.

5.Rinominare il “tronco” ramo “master”

Il ramo di sviluppo principale sarà denominato “tronco” che corrisponde al nome che le è stato in Subversion.Dovrai rinominarlo in Git standard “master” ramo utilizzando:

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

6.Pulire i rami e i tag

git-svn rende tutti Subversions tag in-breve rami in Git di forma “tag/nome”.Si desidera convertire tutti quei rami in Git tag utilizzando:

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

Questo passaggio richiederà un po ' di battitura.:-) Ma, non preoccupatevi;unix shell fornirà un > prompt secondario per l'extra-lungo di comando che inizia con git per-ogni-rif.

GitHub ora ha una funzione di importazione da un repository SVN.Non ho mai provato, però.

Un po ' estesa risposta, solo utilizzando git, SVN, e bash.Esso comprende le procedure per l'SVN repository che non utilizzano il layout convenzionale con un tronco/rami/tag directory layout (SVN non fa assolutamente nulla per far rispettare questo tipo di layout).

Prima di utilizzare questo script bash per eseguire la scansione la vostra repo SVN per le diverse persone che hanno contribuito e per generare un modello per un file di mapping:

#!/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

Utilizzare questo per creare un authors file in cui si mappa svn nomi di nomi utente e e-mail dal proprio gli sviluppatori che utilizzano git config proprietà user.name e user.email (nota: per un servizio come GitHub solo avere una corrispondenza e-mail è sufficiente).

Poi git svn clonare il repository svn di un repository git, raccontando la mappatura:

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

Questo può richiedere incredibilmente lungo, dal momento che git svn, singolarmente controllare ogni revisione, per ogni tag o di un ramo che esiste.(si noti che i tag in SVN sono davvero rami, così finiscono come tale nella Tabella).È possibile accelerare questo rimuovendo vecchie etichette e i rami in SVN non è necessario.

In esecuzione su un server nella stessa rete o sullo stesso server può realmente accelerare questo.Inoltre, se per qualche motivo questo processo viene interrotto può riprendere utilizzando

git svn rebase --continue

In molti casi è finito qui.Ma se la vostra repo SVN ha una struttura anticonvenzionale in cui semplicemente avere una directory in SVN che si desidera mettere in un git branch è possibile fare alcuni passaggi aggiuntivi.

Il più semplice è quello di fare una nuova SVN repository sul server che fa rispettare la convenzione e l'uso svn copy per mettere la vostra directory di tronco o di un ramo.Questo potrebbe essere l'unico modo, se la directory è tutto il senso alla radice del repo, quando ho provato l'ultima questa git svn semplicemente rifiutato di fare un checkout.

È anche possibile eseguire questa operazione utilizzando git.Per git svn clone semplicemente utilizzare la directory che si desidera mettere in un git branch.

Dopo l'esecuzione

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

Nota che questa richiesta Git 1.7 o superiore.

Ho postato una guida passo passo (qui) per la conversione svn in git tra cui la conversione di svn tag git tag e svn rami di git rami.

Versione breve:

1) clone svn da un certo numero di revisione.(il numero di revisione deve essere il più antico che si desidera eseguire la migrazione)

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

2) scarica svn dati.Questo passaggio è quello che ci vuole più tempo.

cd gitreponame
git svn fetch

ripetere git svn recuperare fino a quando termina senza errori

3) prendi il ramo master di aggiornamento

git svn rebase

4) Creare filiali locali da svn rami copiando i riferimenti

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

5) la conversione svn tag in git tag

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) Mettere un repository in un posto migliore come github

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

Se volete maggiori dettagli, leggi il mio post o chiedere a me.

Siamo in grado di utilizzare git svn clone i comandi, come di seguito.

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

Comando genera autori file da SVN commit.

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

Comando di cui sopra, vi fornirà il numero di revisione quando il tuo SVN del progetto è stato creato.

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

Comando genera il repository Git locale.

Il problema è che non convertire i rami e i tag per spingere.Si dovrà effettuare l'operazione manualmente.Per esempio qui di seguito per rami:

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

Per i tag:

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

Ora spingere master, i rami e i tag remoto repository 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
$

svn2git utilità

svn2git programma rimuove le attività manuali con i rami e i tag.

Installarlo con il comando sudo gem install svn2git.Dopo di che, eseguire il seguente comando.

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

Ora si possono elencare i rami, i tag e li spingono facilmente.

$ 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

Immaginate di avere 20 filiali e tag, ovviamente svn2git vi farà risparmiare un sacco di tempo e perché mi piace meglio di comandi nativi.E ' un bel wrapper nativo git svn clone comando.

Per un esempio completo, vedere il mio blog.

TortoiseGit fa questo.vedere questo post del blog: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Sì, so che rispondere con link non è splendida, ma è una soluzione, eh?

Consiglio vivamente questo breve serie di screencast Ho appena scoperto.L'autore illustra le operazioni di base, e presenta alcune delle più avanzate usi.

Se si utilizza SourceTree è possibile farlo direttamente dall'app.Goto File -> Nuovo/Clone quindi eseguire le operazioni seguenti:

  1. Inserisci il telecomando SVN URL "la Sorgente Percorso / URL".
  2. Immettere le credenziali quando richiesto.
  3. Immettere il percorso della cartella come "percorso di Destinazione".
  4. Dare un nome.
  5. In opzioni avanzate, selezionare "Git" dal menu a discesa in "locale, per Creare repository di tipo".
  6. Facoltativamente, è possibile specificare una revisione al clone.
  7. Colpo Di Clone.

Aprire il repo in SourceTree e vedrete i messaggi di commit, sono stati migrati troppo.

Ora vai a Repository -> Impostazioni di archivio e aggiungere il nuovo telecomando repo dettagli.Eliminare la SVN remoto se si desidera (l'ho fatto tramite il menu "Edit Config File" opzione.

Spingere il codice per la nuova repo remoto quando si è pronti e codice liberamente.

Per GitLab gli utenti ho messo un gist come ho migrato da SVN qui:

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

Procedura per eseguire la migrazione da SVN di GitLab

Installazione

  • SVN è ospitato presso svn.domain.com.au.
  • SVN è accessibile tramite http (altri protocolli dovrebbe funzionare).
  • GitLab è ospitato presso git.domain.com.au e:
    • Un gruppo è stato creato con lo spazio dei nomi dev-team.
    • Almeno un account utente è stato creato aggiunto al gruppo, e ha una chiave SSH per l'account utilizzato per la migrazione (test utilizzando ssh git@git.domain.com.au).
    • Il progetto favourite-project è stato creato nel dev-team spazio dei nomi.
  • Il file users.txt conterrà i dettagli dell'utente, un utente per la linea, la forma username = First Last <address@domain.com.au>, dove username è il nome dato in SVN log.(Vedi il primo link nella sezione Riferimenti per i dettagli, in particolare in risposta un utente Casey).

Versioni

  • versione subversion 1.6.17 (r1128011)
  • git versione 1.9.1
  • GitLab versione 7.2.1 ff1633f
  • Ubuntu server 14.04

Comandi

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 git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

Ecco!!!Ricaricare la pagina del progetto in GitLab interfaccia web e vedrete tutti i commit e i file elencati.

Note

  • Se ci sono utenti sconosciuti, il git svn clone comando di stop, in questo caso, l'aggiornamento users.txt, cd favourite-project e git svn fetch continuerà da dove si è fermato.
  • Standard trunk-tags-branches layout per il repository SVN è richiesto.
  • SVN URL per il git svn clone comando arresta al livello immediatamente superiore trunk/, tags/ e branches/.
  • Il git svn clone comando produce un sacco di output, tra cui alcuni avvisi in alto;Ho ignorato gli avvertimenti.

Come un altro, a parte, la git stash comando è una manna dal cielo quando si cerca di git git-svn dcommits.

Un tipico processo:

  1. impostare un repository git
  2. fare un certo lavoro su file diversi
  3. decidere di controllare una parte del lavoro, utilizzando git
  4. decidere di svn-dcommit
  5. ottenere il temuto "non commettere sporco con un indice di errore".

La soluzione (richiede git 1.5.3+):

git stash; git svn dcommit ; git stash apply

Ecco un semplice script di shell con dipendenze che permette di convertire uno o più SVN repository git e li spingono a GitHub.

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

In circa 30 righe di script:cloni utilizzando git SVN, crea un .gitignore file da SVN::ignore proprietà, spinge in un nudo repository git, rinomina trunk SVN per master, converte SVN tag git tag, e lo spinge a GitHub, preservando la tag.

Ho passato attraverso un sacco di dolore per spostare una dozzina di SVN repository di Google il Codice su GitHub.Non ha aiutato che ho usato Windows.Ruby aveva tutti i tipi di rotto sulla mia Debian box e sempre lavorando su Windows è uno scherzo.Altre soluzioni non funzionano con Cygwin percorsi.Ancora una volta ho avuto qualcosa di lavoro, non riuscivo a capire come ottenere il tag per mostrare su GitHub (il segreto è --follow-tag).

Alla fine mi sono messa insieme due brevi e semplici script linkato sopra, e funziona alla grande.La soluzione non deve essere più complicato di così!

Im su una macchina windows e fatto un piccolo Lotto per il trasferimento di un repo SVN con la storia (ma senza rami) per un repo GIT chiamando

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

Forse chiunque può usarlo.Crea un TMP-cartella controlla il repo SVN c'con git e aggiunge la nuova origine e spinge...e cancella la cartella di nuovo.

@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%

È comunque necessario il users.txt con il tuo utente-mapping come

User1 = User One <u.1@xxx.com>

Volevo solo aggiungere il mio contributo per il Git comunità.Ho scritto un semplice script bash che consente di automatizzare l'importazione completa.A differenza di altri strumenti di migrazione, questo strumento si basa su native git invece di jGit.Questo strumento supporta anche il repository con una grande storia delle revisioni e / o grande blob.E ' disponibile tramite github:

https://github.com/onepremise/SGMS

Questo script permette di convertire i progetti archiviati in SVN con il seguente formato:

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

Questo schema è anche popolare e ben supportate:

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

Ciascun progetto dovrà ottenere sincronizzate tramite nome progetto:

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

Se si desidera convertire l'intero repo, usare la seguente sintassi:

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

L'utilizzo in modo efficace con Subversion Git è una dolce introduzione a git-svn.Per SVN repository git-svn rende super facile.Se stai iniziando un nuovo repository, è molto più semplice creare un vuoto repository SVN e quindi importare utilizzando git-svn che si sta andando nella direzione opposta.La creazione di un nuovo repository Git e poi importare in SVN può essere fatto, ma non è un po ' doloroso, soprattutto se siete nuovi a Git e di speranza per preservare il commit storia.

Scarica il Rubino installer per Windows e installare la versione più recente con esso.Aggiungere Rubino eseguibili per il tuo percorso.

  • Installare svn2git
  • Menu Start -> Tutti i programmi -> Ruby -> Avviare un prompt dei comandi con Rubino
  • Quindi digitare “gem install svn2git” e immettere

    La migrazione del repository di Subversion

  • Aprire un Rubino prompt dei comandi e passare alla directory in cui il file di cui eseguire la migrazione

    Quindi svn2git http://[dominio name]/svn/ [repository principale]

  • Si può richiedere alcune ore per migrare il progetto Git dipende da progetto a progetto codice dimensioni.

  • Questo importante passo aiuta a creare il repository Git struttura, come indicato di seguito.

    SVN (/Project_components) tronco --> Git master SVN (/Project_components) rami --> Git rami SVN (/Project_components) tag --> Git tag

Creare il repository remoto e inserire le modifiche.

GitHub è un importatore.Una volta che hai creato il repository, è possibile importare da un archivio esistente, tramite il suo URL.Si chiederà le credenziali, se applicabile, e passare da lì.

Come si esegue troverà autori, e si può semplicemente eseguire il mapping degli utenti su GitHub.

L'ho usato per un paio di archivi, ed è abbastanza preciso e molto più in fretta.Ci sono voluti 10 minuti per un repository con ~4000 commette, e dopo che ha preso il mio amico a quattro giorni!

Molte risposte qui riferimento a https://github.com/nirvdrum/svn2git, ma , per grandi repository questo può essere lento.Ho avuto una prova utilizzando https://github.com/svn-all-fast-export/svn2git invece, che è uno strumento con esattamente lo stesso nome, ma è stato utilizzato per eseguire la migrazione di KDE da SVN, Git.

Leggermente più lavoro per configurarlo, ma quando è fatto la conversione stessa, per me, ha preso minuti in cui l'altro script trascorso ore.

Ci sono diversi metodi per raggiungere questo obiettivo.Ho provato alcuni di loro e trovato a lavorare con git e svn installato nel sistema operativo Windows.

Prerequisiti:

  1. git su windows (io ho usato questo) https://git-scm.com/
  2. svn con gli strumenti per la console installato (io ho usato tortoise svn)
  3. File di Dump del vostro repository SVN.svnadmin dump /path/to/repository > repo_name.svn_dump

I passi per raggiungere il traguardo finale (spostare tutti i repository con la storia di un repository git, in primo luogo git locale, remoto)

  1. Creare un repository vuoto (utilizzo di strumenti per la console o tortoiseSVN) nella directory REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, mettere dumpfile.dump in REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Attendere per questa operazione, potrebbe essere lungo

  3. Questo comando è silenzioso, così aperta la seconda finestra di comando : svnserve -d -R --root REPO_NAME_FOLDER Perché non basta usare file:///......?Causa prossima del comando fallirà con Unable to open ... to URL:, grazie per la risposta https://stackoverflow.com/a/6300968/4953065

  4. Per creare una nuova cartella SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn://localhost/ Attesa per questa operazione.

Infine, che cosa abbiamo ottenuto?

Consente di controllare il nostro repository Locale :

git log

Vedere il precedente si impegna?Se sì, va bene

Così ora avete pienamente funzionale repository git locale con le sorgenti e il vecchio svn storia.Ora, se si desidera spostare alcuni server, utilizzare i seguenti comandi :

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

Nel mio caso, ho bisogno di tag comando perchè il mio repo non hai tags.

Buona fortuna!

La conversione di svn submodule/cartella 'Modulo' in git con la storia, senza etichette né rami.

Per mantenere svn ignorare elenco sopra i commenti dopo il passaggio 1

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top