Los usuarios de Git en una tienda de SVN, organizando nuestros repositorys

Trabajo en una tienda de SVN, pero para inyectar un poco de cordura en mi trabajo uso git-svn. Un número cada vez mayor de mis colegas también está viendo la luz, y ahora nos gustaría, en algunos casos, SVN completamente de lado. Actualmente, cada uno de nosotros tiene nuestro propio repository git-svn, pero debido a los valores hash muy diferentes no podemos compartir nada, excepto parches simples o vía SVN. ¿Cómo debemos organizar nuestros repos para permitir el intercambio directo (a través de git-remote)?

La única forma en que puedo pensar es en un repository git-svn único y compartido, que usamos como puerta de input a SVN, pero que probablemente sería un poco engorroso para trabajar, sería mucho mejor si todos lo hiciéramos. podría empujar a SVN directamente desde nuestros propios repositorys git-svn.

Editar: Desafortunadamente no tengo acceso de administrador al server SVN, por lo que las soluciones como subgit son de poca utilidad en este momento, aunque son de su interés.

Puedes mirar el subgit :

SubGit es una herramienta para una migration sin problemas de Svn a Git. Instálelo una vez en el lado del server y use Subversion y Git todo el time que desee.

SubGit le permite a uno configurar una Subversión bidireccional a la replicación de Git (mirror editable).

Y:

SubGit es una solución para una migration de Svn a Git en toda la compañía que es:

Much better than git-svn (see comparison); Requires no changes of the infrastructure that is already in place; Allows one to use all Git and all Subversion features; Provides genuine stress-free migration experience. 

El gatewaying bidireccional entre dos sistemas de control de versiones diferentes es anterior a git por edades. Ya lo hice a mano entre CVS y Arch hace unos 10 años. Si no desea comprar un subgit, puede mantener el gateway manualmente o incluso intentar crear un script. El flujo de trabajo es simple:

  • Tiene dos twigs, trunk y master . trunk replica subversion, master es más los cambios desarrollados en git
  • Siempre que haya un nuevo cambio en la subversión:
    1. $ git svn fetch
    2. master$ git merge trunk
  • Siempre que se empuje el tronco:
    1. trunk$ git merge master
    2. trunk$ git svn dcommit
    3. master$ git merge trunk
  • Debería hacer ambas secuencias atómicamente, es decir, solo una operación a la vez.
  • Puedes considerar configurar git-svn para que no reescriba los commits con la información de revisión de subversión para networkingucir el número de commits de fusión en git.
  • Se puede hacer para múltiples twigs, pero no creo que fusionar twigs de subversión separadas en git pueda funcionar.

Estamos exactamente en la misma situación. Lo que tenemos es (¡advertencia, algún pseudocódigo!):

  • Remote Git Repo, con guión (usando scripts bash), no se puede –bare
  • un gancho de pre-recepción que verifica el nombre de usuario, luego por cada reference recibida y para todas las twigs mapeadas SVN: (git -> svn):

    • git checkout -f <branch>
    • git reset HEAD --hard
    • git clean -fdx
    • git merge -n $newrev
    • git svn dcommit
    • si falló, revertir todo,

    • luego, después de todos los loops, actualice todas las twigs de SVN (usando la secuencia de commands, ver a continuación)

  • un cronjob que actualiza las twigs de git-svn con los últimos cambios de svn (svn -> git):

    • git checkout --orphan svn-update <random-branch-name>
    • git svn fetch --all
    • para todas las twigs de git-svn: git branch -D <branch> && git branch --track <svn-branch> refs/remotes/<svn-branch> ,
  • ssh keys para authentication de git

  • authentication SVN administrada por los usuarios (basada en los nombres de usuario de git, esto dependerá de su configuration)

De esta forma nadie usa SVN directamente y la única diferencia frente a git puro es que no puedes cambiar el historial de git-svn branches (ya que SVN no te permitirá comprometer eso).

sería mucho mejor si todos pudiéramos presionar a SVN directamente desde nuestros propios repositorys git-svn.

¿No es para qué git svn dcommit command git svn dcommit ?

Utilice git svn rebase para git svn rebase a establecer la base de su clon git en el svn repo central, luego git svn dcommit para enviar sus commits locales a svn.

Uso git svn todos los días con el espejo git GCC y funciona muy bien. Tal vez sea porque hay un espejo central de solo lectura, que se actualiza automáticamente desde svn commits, para que todos los que usen git-svn vean el mismo historial desde el espejo git y el mismo set de identificaciones de compromiso. Eso permite search y fusionar desde el espejo de solo lectura, luego solo con un git svn rebase y git svn dcommit para enviar cambios al svn repo. Esos cambios luego se sincronizan con el espejo de solo lectura y son recuperados por todos los demás, con los mismos ID.

Estoy en una configuration similar, y aquí hay un process que funcionó para mí y la gente con la que trabajo:

  1. Una persona crea un repository de Git usando git svn clone y friends.

  2. Todos los demás clonan ese primer repository de Git usando commands regulares de Git, luego copyn los bits de svn-remote.{name} del .git/config del primer repository. Hay instrucciones para hacer esto en los ejemplos en git help svn .

Ahora, todos tienen una configuration de git-svn que se puede usar para interactuar con el repository de Subversion.

Lo que es más importante, todos tienen una configuration de git-svn con las mismas twigs y el mismo historial de confirmaciones, lo que significa que las confirmaciones que git svn fetch y friends creen serán idénticas, incluidos los hashes . En ese punto, además de empujar y tirar al repository de Subversion, puede usar todas las características distribuidas más elegantes de Git entre ustedes.

A diferencia del Git normal, debe tener cuidado al compartir la configuration: si la estructura de su bifurcación diverge, sus hashes también divergirán. De vez en cuando, las cosas van a salir mal y hay que arreglarlas (una vez tuve dos git svn fetch estaban sucediendo a la vez, lo que hizo que los demás trabajaran de una manera sutil; tuve que rebobinar mi historial con git svn reset y relabelr para mantener mi hashes que coinciden con los de otras personas). Pero estas son las restricciones de mezclar las dos herramientas juntas.