software para consola svn git workflow git-svn

para - git clon del árbol git-svn?



github cmd (6)

Como he dicho a menudo en #git:

git-svn es como un auto volador. Todo el mundo quiere un auto volador, hasta que se den cuenta de que un auto volador es muy malo, ya sea como un automóvil o un avión.

La verdadera solución es alejarse del SVN por completo, lo más rápido posible. Use git-svn para una migración única, luego muévalos a todos. Git no es tan difícil de aprender.

Tengo un árbol de trabajo ''git-svn''. Me gustaría clonar un repo de git "puro", y luego usar git push / pull para mover los cambios entre el árbol de git-svn y el árbol de git, mientras también uso ''git svn dcommit / rebase'' para mover los cambios entre el árbol git-svn y el repositorio SVN en el que se basa.

Esto parece funcionar bien en cuanto a mover cosas de un lado a otro entre los árboles git utilizando métodos git, pero tan pronto como interactúo con el repositorio SVN en el árbol git-svn, las cosas se ponen feas: o me dan errores al pulsar o tirando entre los árboles de git, o pierdo compromisos en el árbol de git-svn u otras rarezas.

¿Este tipo de flujo de trabajo SVN <-> git-svn <-> git es compatible o simplemente debería dejar de ladrar en este árbol?


Según lo que he visto, este flujo de trabajo no es compatible con git-svn, y no lo será, debido a la forma en que SVN representa las fusiones.


Una cosa que puede estar causando problemas es que git svn dcommit reescribirá todas las confirmaciones que envía a SVN, al menos si está configurado para agregar la nota de metadatos SVN al final de los mensajes de confirmación. Por lo tanto, tendrá que adoptar un flujo en el que los repositorios que se comprometan desde su espacio de trabajo de git-svn rebase contra él, perdiendo todo el historial de fusión que no puede almacenarse en SVN de todos modos.


Usando git y git-svn 1.7.1, parece que la prueba que acabo de hacer parece funcionar bien.

git svn init [url] git svn fetch

luego debe crear y verificar una rama ficticia para poder enviarla a la rama principal.

git checkout -b dummy

Luego puedes clonarlo ( git clone ... ) en otro repositorio de git puro, modificarlo, confirmarlo ( git commit ) y luego presionar ( git push ) en el git-svn repo.

de vuelta al git svn repo:

git checkout master git svn dcommit

comprometerá todas las confirmaciones de git que se hayan enviado.


Si puede instalar ganchos personalizados en el repositorio de Subversion, considere usar SubGit .

SubGit es una solución del lado del servidor que sincroniza automáticamente los repositorios SVN y Git. Para instalar SubGit, haga lo siguiente:

$ subgit configure $SVN_REPOS $ # Adjust $SVN_REPOS/conf/subgit.conf $ # to specify your branches and tags $ # Adjust $SVN_REPOS/conf/authors.txt $ # to introduce svn author names to their git counterparts $ subgit install $SVN_REPOS $ ... $ INSTALLATION SUCCESSFUL

En este momento, SubGit ha instalado ganchos que son activados por cada svn commit y git push . De esta forma, SubGit convierte cualquier modificación entrante.

Ver también la comparación con git-svn .


Tengo una configuración de puente para algunos de mis proyectos, pero es solo unidireccional desde git a svn (que proporciona un espejo SVN público de solo lectura de nuestra rama principal de git). Sin embargo, dado que funciona bien, podría ayudarte o apuntar en la dirección correcta en tu escenario bidireccional de todos modos, ya que supongo que es git-> svn que crea problemas, no svn-> git:

Mi escenario unidireccional: el repositorio existente de gitub en github necesita un espejo svn de solo lectura de la rama git master

  • Cree e inicialice el repositorio de subversión de destino en el Servidor:

    svnadmin create svnrepo mkdir trunk svn import trunk svn://yoursvnserver/svnrepo rmdir -rf trunk

  • Crear un pago mixto de Git-Svn e inicializar el repositorio de subversión

    git svn clone svn://yoursvnserver/svnrepo/trunk cd trunk git remote add github git://github.com/yourname/repo.git git fetch github git branch tmp $(cat .git/refs/remotes/github/master) git tag -a -m "Last fetch" last tmp INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1) git checkout $INIT_COMMIT . git commit -C $INIT_COMMIT git rebase master tmp git branch -M tmp master git svn dcommit --rmdir --find-copies-harder

  • Actualiza el espejo

    git fetch github git branch tmp $(cat .git/refs/remotes/github/master) git tag -a -m "Last fetch" newlast tmp git rebase --onto master last tmp git branch -M tmp master git svn dcommit --rmdir --find-copies-harder mv .git/refs/tags/newlast .git/refs/tags/last

Estos dos artículos de googlecode también pueden ser de ayuda: