git & svn externals-¿una solución final todavía?
workflow svn-externals (2)
este es el flujo de trabajo que uso actualmente para mis proyectos svn (nunca uso svn ramas, y otras personas también trabajan activamente en algunos proyectos):
- en el servidor, realice la
git svn fetch
inicial degit svn fetch
que puede tardar horas. También crea una rama ''construir''. - en una máquina de desarrollo la clonación ahora es rápida:
git clone srv://project.git, git checkout build
seguido degit update-refs ..., git svn fetch
para restaurar el enlace al repositorio de svn - trabajar, cometer, trabajar cometer, ...
- para comprobar si las cosas son sensatas,
git push build
al servidor y activa una compilación en Hudson para esa rama - para almacenar el trabajo de modo que pueda trabajar en él desde otra máquina, también presione la rama de compilación
- cuando esté satisfecho, unir los compromisos en pasos lógicos (por ejemplo, uno para cada error), cometer svn y restablecer todo, como
git checkout master, git merge build, git svn dcommit, git push, git checkout build, git rebase master, git push build
Introduzca svn externals. Ya probé todos los guiones here pero todos fallaron. Mis externos están configurados de esta manera:
/path/to/x x
/path/to/y/z y/z
/path/to/a/b.file a/b.file
y los scripts hacen cosas como intentar crear /path/to/x
en la raíz del sistema de archivos y git svn fetch /path/to/x
. También los archivos individuales parecen causar más problemas. (pregunta 1: ¿cuál es el formato svn: externals para el que se escribieron estos scripts?)
Parece que no es difícil modificar uno de los scripts para manejar mi situación y replicar la estructura de directorios que busco correctamente, pero luego tengo un gran problema: si cambio un archivo tanto en x como en y / z directorios, no veo una manera de unir esto en un solo svn commit y esa es una de las razones por las que comencé a usar git en primer lugar.
De ahí la pregunta: ¿hay una manera en que pueda replicar el flujo de trabajo anterior, usando solo partes de un determinado repositorio svn, de tal manera que pueda hacer svn dcommit en la raíz? Prefiero una solución lista para usar que funcione tanto en Linux como en Windows.
edit . Rápidamente pirateé uno de los scripts que encontré y lo hice replicando la estructura de directorios de los svn externos. No puedo clonar archivos individuales, sin embargo, aquí está la salida:
git svn clone -r HEAD srv://svn/repo/path/to/projects.sln
Initialized empty Git repository in xxx/projects.sln/.git/
Invalid filesystem path syntax: REPORT request failed on ''/svn/repo/!svn/vcc/default'':
Cannot replace a directory from within at yyy/git/libexec/git-core/git-svn line 5114
Pregunta secundaria 2: ¿no es posible obtener un solo archivo a través de git svn?
Desafortunadamente, los elementos externos de svn son bastante flexibles. Me he encontrado con una serie de scripts que los tratan como <ruta> <url>, pero <url> <ruta> también está permitido. Así que creo que algunos de los guiones están rotos en ese sentido.
Para contestar tu segunda subpregunta: no. ''git svn fetch'' necesita operar en un subárbol del repositorio de Subversion, pero debe ser algo que pueda tratarse como una rama. Lo único que se asigna bien a ese paradigma es un directorio (troncal /, por ejemplo). FWIW, Bazaar y Mercurial también sufren aquí. Al final del día, Subversion es solo un sistema de archivos versionado, mientras que Git tiene un concepto de primera clase de una rama. Este es uno de esos desajustes que se interponen en el camino. :-(
Solo una nota más sobre la segunda subpregunta. Por lo que sé, hasta la fecha, Subversion tampoco admite svn externals para archivos, solo carpetas. Así que supongo que tales entradas en las propiedades no serían válidas. No sé si hay alguna herramienta que maneja este caso.