2009-08-21 14 views
6

Estoy cansado de la subversión, sigue corrompiendo su propio repositorio. Como durante mucho tiempo fui una curiosidad de git y siempre quise probarlo, he decidido probarlo y usar git-svn. Pero al leer la documentación, me di cuenta de que no puedes usar gran cantidad de genialidad con ella. No puedes usar git-pull, no se recomienda crear sucursales locales y hay muchas limitaciones. Parece que no es mucho mejor que usar Subversion directamente. ¿O es eso? ¿Qué pros y contras git-svn tiene sobre simplemente svn?¿Cuáles son los pros y los contras de usar git-svn?

PS. Lo siento pero no te estoy preguntando cómo arreglar mi repositorio de subversión, no me importa tanto. Eliminar todos los .svn y finalizar la compra en el mismo directorio durante la noche funciona bien. Solo me preguntaba qué beneficios podría traer Git-svn a la mesa.

+7

Realmente no debería recibir problemas de subversión como ese. El repositorio de Subversion que administramos en el trabajo es bastante grande (más de 10.000 archivos) y nunca hemos tenido problemas de corrupción con él. Suena más como un problema de hardware, las corrupciones arbitrarias nunca deberían suceder. – Kezzer

+3

Supongo que su repositorio no es usado por no programadores :) Pueden romper cualquier cosa. – vava

+0

@vava: los no programadores podrían romper su _copia de trabajo_ y perder enormes cantidades de trabajo, pero definitivamente no deberían poder romper el _repositorio_. Algo parece estar sospechoso allí y si fuera tú, trataría de descubrir cómo sucede esto antes de hacer cualquier otra cosa. – sbi

Respuesta

4

Pros:

  • Todo lo que Git es bueno para:
    • libre acceso de la red a todos los antiguos compromete
    • cometió y rebase en Git (de nuevo, la red gratis) y luego git svn dcommit para empujar todos los cambios en SVN para un buen limpia cometer
    • ramificación local barata (no sé por qué dice esto no funciona tan bien)
  • no tiene que lidiar con SVN tanto :)

Contras:

  • Mucho mejor flujo de trabajo si ya sabe tanto Git y SVN (es decir, no tan bueno para los nuevos usuarios de control de origen)
  • confundirá a cualquier otra persona si se fijan en lo que estás haciendo
  • Algunas características de sVN (como svn: keywords) que no están disponibles/convenientes
+0

Estoy obligado a usar SVN en la universidad y aún prefiero usar Git con el puente SVN. Dicho esto, no puedes aprovechar plenamente Git hasta que SVN esté fuera de la ecuación. –

2

Mi experiencia con git-svn es que es principalmente útil para los usuarios de git (experimentados) que quieren tener una interfaz tipo git para un repositorio de subversión. Asimilar tanto el conjunto de conceptos git como las limitaciones de git-svn era demasiado, al menos para mí.

Si puede, le recomiendo que cambie a git por completo.

He visto a muchas personas quejándose de Subversion, pero hasta donde yo sé, es bastante estable. ¿Estás seguro de que no tienes problemas de hardware?

+0

Sí, estoy seguro :) A veces se rompe cuando los nombres de los archivos son demasiado largos o si la conexión se va hacia el sur en medio de la confirmación. Tratar con un repositorio de 2GB no es fácil para una mala subversión. Lástima que no puedo cambiar a git por completo. – vava

+0

¿Ha pedido ayuda en la (s) lista (s) de correo de SVN? Apuesto a que estarían muy interesados ​​en tales asuntos. – sbi

+0

Es inútil, no tengo un caso de prueba para mostrarlos de todos modos. – vava

0

No veo problemas para migrar todo el repositorio svn a git, guardando el historial y todos los demás en él, y luego cambiar a git por completo.

2Gb es mucho para un solo repositorio. ¿Puede valer la pena dividirlo en algunas partes?

+0

Desafortunadamente, no soy el único empleado :) Y los que no son programadores podrían entender Tortoise SVN hasta cierto punto, pero sería demasiado duro con ellos. Entonces, migrar a git no es una opción triste. – vava

1

Si el uso es:

  • "Nos mantener SVN pero tienen Git para una rápida ramificación interno", sin necesidad de utilizar git-svn: se puede 'git init' directamente dentro de una sucursal de su espacio de trabajo de la subversión y el truco git directamente dentro de esa parte de tu código.

Pero si esto es:

  • "Mantenemos tanto un repo central de SVN y un repositorio git", entonces las cosas son un poco más complicado, debido a que:
    • un simple git-svn reproducirá las "ramas SVN" (en realidad un directorio simple con copias en él), así que recomendaría usar svn2git and git2svn
    • tratando de importar todo en un repositorio Git es no siempre es una buena idea (ver "What are the git limits?"): si su sistema está compuesto por diferentes módulos que pueden desarrollarse independientemente uno del otro, pueden vivir dentro de un único repositorio central SVN, pero deben tener su propio repositorio Git (en para ser capaz de tirar sólo los módulos que necesite)
1

creo que el cambio en git no va a resolver sus problemas. Si tiene "no programadores" dentro de su fuerza de trabajo, estos romperán a otras personas que trabajan en la copia (supongo que al renombrar/eliminar directorios o archivos).

Si va a usar git-svn o git o cualquier otro VCS y la gente aún cambia el nombre/elimina sus directorios, ¿cómo debería mejorar esto?

Creo que deberías tratar de capacitar a algunas personas para que entiendan los conceptos básicos de VCS.

Si la gente no entiende los flujos de trabajo SVN, dudo que dominarán git-svn o git.

+0

Es por eso que quiero esconderme detrás de git-svn :) No lo sé con certeza, pero me gustaría pensar que el git es más avanzado y no se romperá tan fácilmente. – vava

+0

git-svn introducirá más complejidad y se descompondrá tan fácilmente como svn, si elimina y cambia el nombre de los archivos salvajemente e intenta fusionarse. Deberías buscar el origen de tus problemas. –

3

Estas son las ventajas y desventajas específicas de git-svn. Entonces, no se trata realmente del git en sí mismo.

Pro:

La tendencia de las personas que utilizan SVN es cometer grandes cambios a la vez, ya que es necesario comprometerse sobre el alambre. Este enfoque puede ser malo porque a veces los cambios pueden no estar relacionados entre sí. Por ejemplo, puede tener cambios con correcciones de errores y cambios para la nueva función confirmada en un conjunto de cambios. Con git puedo comprometerme tan a menudo con mi repositorio git local (especialmente cuando no estoy conectado a una red) y tengo un conjunto de cambios lo más pequeño posible. Luego me comprometo a svn (usando 'git svn dcommit') cuando todo grandes cambios está listo.

Con:

El aire de haber svn como el repositorio remoto es la fusión, sobre todo cuando hay conflictos. A veces puede ser doloroso. Yo uso IntelliJ como mi IDE y para resolver conflictos, tengo que ir a la línea de comandos para solucionarlo. Sabiendo que me encuentro con este problema a menudo, I have documented it y ahora ya no se convierte en un gran problema para mí.

+5

Tu enlace está muerto. –

3

que emigraron a git utilizando git-svn. Nuestro repositorio svn todavía está intacto y todavía tenemos todo el "genialidad git". Esencialmente, después del clon git-svn, lo bifurca nuevamente como su 'tronco'. Todos los que usen git se ramificarán desde aquí. Cuando necesite obtener actualizaciones de svn, simplemente haga git-svn rebase y luego haga git merge --squash desde la rama svn al nuevo 'trunk'. Y viceversa. Esto significará que su historial en el repositorio svn no coincidirá con lo que está en git. Cuando haces más de una combinación, en algún momento tendrás que comenzar a realizar confirmaciones de injerto porque la historia no coincide. Sin embargo, si injertas la CABEZA de tu tronco de git en la última identificación de confirmación que fue una combinación aplastada, obtendrás el mismo efecto.

Ok así que vamos a descomponerlo lo mejor que pueda con un ejemplo.

SVN repo: SVN: //xyz.com/myproject

git svn clone svn://xyz.com/myproject 

Esto debe salir con una configuración git-svn normal con una rama principal que tiene la misma historia como el repositorio SVN.

git checkout -b git_trunk 

git_trunk se convierte en el "tronco" de los usuarios de git.

Esta rama se puede usar libremente como cualquier otro repositorio git.

Ahora tiene que sincronizar estos dos ramas a través de git fusionar --squash

Por ejemplo .. la fusión de la rama SVN maestro para git_trunk

git checkout git_trunk 
git merge --squash master 
git commit -a 

Se podría hacer lo mismo con el fin de combinar desde git_trunk al maestro sVN excepto usted ejecutaría

git svn dcommit 

Esto empujará de nuevo a sVN.

Así que la parte complicada aquí es que ya que estamos utilizando --squash la historia de fusiones se pierde y el único ancestro común git sabrá nunca es el punto de ramificación. Esto significará fusionar conflictos.La forma en que lo resolví fue haciendo algo como esto

Fusionando de git_trunk a la maestra. Primero tomo la identificación de commit de la última squash en git_trunk. Vamos a llamarlo ABCDEFG. Luego recibo el commit-d de git_trunk. Digamos que su HIJKLMNO

echo "HIJKLMNO ABCDEFG" > .git/info/grafts 

Esto le dirá cuando la fusión de Git que el ancestro más común es aplastado los más recientes se comprometen.

No es perfecto, pero funciona muy bien para mí. Especialmente ahora ya que casi todos están en git.

+0

Por lo tanto, creó un repositorio público de git que todos los que les gusta el git están usando y de vez en cuando solo comprometen a todos esos cambios en subversión principal. La gente pobre que se fue en svn ya no puede usar la culpa :) – vava

Cuestiones relacionadas