migrar de subversion a git
git svn especifica ramas y etiquetas en un diseño de repositorio svn no estándar (2)
El diseño es:
Branches/
Project1/
Branch11/
...
Branch1N/
Project2/
Branch21/
ProjectX/ # not anywhere else
Excluded1/
Excluded2/
Excluded3/
Excluded4/
Programs/
Excluded11/
...
Excluded1N/
Project1/ # the main one
Project2/
...
ProjectN/
Tags/
Project1/
Release1/
...
Release69/
Excluido logré excluir, pero no puedo entender cómo puedo mapear ramas / etiquetas a git branches / tags, preferiblemente después del hecho (cada clon tarda ~ 5 horas).
Tenga en cuenta que soy nuevo en SVN: no sé ni entiendo el sistema de bifurcación / etiquetado.
Estoy en windoz - svn2git no es una opción (de todos modos, estoy interesado en cómo hago esto después del clon o, peor aún, en la clonación, pero solo con vanit git)
Además, no pretendo que sea una migración permanente, funcionará como un puente entre el SVN y el nuevo git repo utilizado en el desarrollo, así que quiero conservar la mayor cantidad de información posible, pero no más de lo necesario. En algún momento, podría convertirse en permanente, donde luego tendré que filtrar confirmaciones vacías (a los proyectos excluidos), supongo (?)
Comando:
$ git svn clone --ignore-paths = "^ (?: Lanzamientos | Proyectos | Scripts | Juegos |) / | ^ Programas / (?: Nif Scanner | Nif Viewer | Raziel23x''s Oblivion Toolset | Shader Disasm | Shader Editor) /" --authors-file = authors_with_emails.txt svn: //svn.code.sf.net/p/oblivionworks/code/.
Después del clon tengo:
$ git branch -r
git-svn
$ git branch
* master
Recapitulación : he clonado lo que excluía lo que quería excluir, ahora quiero decir a git "crear una rama git para cada una de esas ramas svn", una verdadera rama git que calcula los deltas y los comprime y elimina la carpeta Branches
- y rastrearlos, y este directorio de etiquetas (700 mb) son solo etiquetas, ¿qué podrías hacer al respecto? no corresponden a confirmaciones)? "
No veo mal el maletero
Mi config
:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[svn-remote "svn"]
ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x''s Oblivion Toolset|Shader Disasm|Shader Editor)/
url = svn://svn.code.sf.net/p/oblivionworks/code
fetch = :refs/remotes/git-svn
[svn]
authorsfile = authors_with_emails.txt
[gui]
wmstate = zoomed
geometry = 787x377+54+59 305 1127
[remote "github"]
url = https://github.com/Utumno/wrye_bash_refactoring.git
fetch = +refs/heads/*:refs/remotes/github/*
[branch "master"]
remote = github
merge = refs/heads/master
Hice algo como esto recientemente.
Antes que nada, no estoy seguro de por qué quieres reorganizar todo después de mudarte de svn a git. Dudo que eso sea posible.
En segundo lugar, no soñaría con hacer esto sin svn2git. No estoy seguro de a qué se refiere el problema de Windows: svn2git está escrito en Ruby. No uso Windows si puedo evitarlo, pero seguramente hay una implementación de Ruby para Windows, a través de Cygwin, nada más.
En tercer lugar, y esta era la clave, utilicé svndumpfilter para obtener el repositorio svn justo como yo quería (es decir, en una forma que svn2git consumiría felizmente) antes de convertir. Esto tomó un poco de prueba y error, pero funcionó muy bien al final.
Consulte http://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate y http://svnbook.red-bean.com/en/1.7/svn .reposadmin.maint.html # svn.reposadmin.maint.filtering (ajuste los enlaces para su versión de SVN) para obtener más información.
EDITAR: Habría hecho un comentario, pero es demasiado largo. Creo que lo mejor que podrás hacer es algo como esto:
[svn-remote "svn"]
ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x''s Oblivion Toolset|Shader Disasm|Shader Editor)/
url = svn://svn.code.sf.net/p/oblivionworks/code
fetch = Programs/Wrye Bash:refs/remotes/git-svn/Wrye Bash
branches = Branches/Wrye Bash/*:refs/remotes/git-svn/Wrye Bash/branches/*
fetch = Programs/Skyrim Viewer:refs/remotes/git-svn/Skyrim Viewer
fetch = Programs/CBash:refs/remotes/git-svn/CBash
branches = Branches/CBash/*:refs/remotes/git-svn/CBash/branches/*
# etc.
Es decir, una fetch
y, si corresponde, una línea de branches
para cada programa que le interese. Al igual que en la respuesta a la que se vinculó, debe purgar el archivo .git/svn/.metadata
antes de hacer git svn fetch
nuevo.
Pero esto no afecta mi comentario anterior: sigue siendo cierto que su historial de git es completamente lineal y no refleja el historial real de bifurcaciones y fusiones de su proyecto. Esto no será lo que quieras si haces de esto una migración permanente.
Para ramas:
En tu archivo de configuración de git puedes controlar dónde se encuentran las ramas de svn:
[svn-remote "svn"]
url = file:///some.url.to/svn/dir
fetch = trunk:refs/remotes/trunk
branches = Branches/*/*:refs/remotes/*
Entonces puede configurar las diferentes referencias a las ramas.
OK para que pueda hacer lo mismo con las etiquetas, porque en svn, las etiquetas y las ramas son muy similares.
branches = Tags/*:refs/remotes/*
Pero si quieres etiquetas git "reales", no hay problema, una vez que las hagas referenciar como sucursales, puedes modificar tu git repo nuevamente para hacer buenas referencias a etiquetas git:
git-for-each-ref refs/remotes/origin/tags | cut -d / -f 5- |
while read ref
do
git tag -a "$ref" -m"say farewell to SVN" "refs/remotes/origin/tags/$ref"
git push origin ":refs/heads/tags/$ref"
git push origin tag "$ref"
done
Obviamente, necesitará modificar ligeramente estos scripts para sus propósitos.