Come faccio a eseguire la migrazione di un repository SVN con la storia di un nuovo repository Git?
-
09-06-2019 - |
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.
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
Pro Git 8.2 spiega:http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git
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
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.
- Configura i tuoi telecomandi
Eseguire:
$ git remote add origin url://your/repo.git
- 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.
- 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:
- Inserisci il telecomando SVN URL "la Sorgente Percorso / URL".
- Immettere le credenziali quando richiesto.
- Immettere il percorso della cartella come "percorso di Destinazione".
- Dare un nome.
- In opzioni avanzate, selezionare "Git" dal menu a discesa in "locale, per Creare repository di tipo".
- Facoltativamente, è possibile specificare una revisione al clone.
- 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 neldev-team
spazio dei nomi.
- Un gruppo è stato creato con lo spazio dei nomi
- Il file
users.txt
conterrà i dettagli dell'utente, un utente per la linea, la formausername = First Last <address@domain.com.au>
, doveusername
è 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'aggiornamentousers.txt
,cd favourite-project
egit 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 superioretrunk/
,tags/
ebranches/
. - 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:
- impostare un repository git
- fare un certo lavoro su file diversi
- decidere di controllare una parte del lavoro, utilizzando git
- decidere di
svn-dcommit
- 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:
- git su windows (io ho usato questo) https://git-scm.com/
- svn con gli strumenti per la console installato (io ho usato tortoise svn)
- 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)
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_FOLDERsvnadmin load REPO_NAME_FOLDER < dumpfile.dump
Attendere per questa operazione, potrebbe essere lungoQuesto 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à conUnable to open ... to URL:
, grazie per la risposta https://stackoverflow.com/a/6300968/4953065Per creare una nuova cartella SOURCE_GIT_FOLDER
cd SOURCE_GIT_FOLDER
- 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.
- git svn clone --no-metadati --tronco=SomeFolder1/SomeFolder2/SomeFolder3/Miomodulo http://svnhost:port/repo_root_folder/MyModule_temp -Un C:\cheetah\svn\authors-transform.txt
- git clone MyModule_temp Miomodulo
- cd Miomodulo
- git flusso di init
- git remote set-url di origine https://userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git push origin master u
- git push -u origine sviluppare
Per mantenere svn ignorare elenco sopra i commenti dopo il passaggio 1