2009-02-20 17 views
16

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.git clon del árbol git-svn?

Esto parece funcionar bien en cuanto a mover cosas de un lado a otro entre los árboles git usando métodos git, pero tan pronto como interactúo con el repositorio SVN en el árbol git-svn, las cosas se ponen feas - o consigo errores al empujar o tirar entre los árboles de git, o pierdo commits en el árbol de git-svn u otras rarezas.

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

Respuesta

5

Sobre la base de lo que he visto, este flujo de trabajo no es compatible con git-svn, y no habrá, debido a la forma SVN representa fusiones.

+0

Así que esta pregunta se presenta aquí con una respuesta durante casi un año, y finalmente agrego algo, así que tengo algo razonablemente correcto para aceptar (sin ofender a Christoph), y luego dos personas salen de la carpintería para ofrecer versiones de la misma cosa Publiqué. Increíble. – genehack

9

Tengo una configuración de puente para algunos de mis proyectos, pero es solo unidireccional desde git a svn (proporcionando 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 único- escenario manera: existente repositorio Git en gitHub, necesita un espejo sVN de sólo lectura del git rama principal

  • crear e inicializar el repositorio de subversión destino en el servidor:

    svnadmin create svnrepo 
    mkdir trunk 
    svn import trunk svn://yoursvnserver/svnrepo 
    rmdir -rf trunk 
    
  • Crear un git- mixta Svn checkout e inicializar repositorio subversion

    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 
    
  • actualización 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 podrían ayudar también:

+0

He votado esta respuesta, ya que creo que en general es útil, sin embargo, se basa en una premisa defectuosa. El problema casi seguro no es el git-> svn, ni el svn-> git, al menos no directamente. Más bien, el paso git-svn-> git será el problema, ya que el historial está siendo reescrito por svn-> git, lo que significa que los dos repositorios ya no tendrán el mismo historial, y la vida se volverá confusa. –

3

Como he dicho a menudo en #git:

git-svn es como un coche 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 de SVN por completo, lo más rápido posible. Use git-svn para una migración única, luego muévalos a todos. Git es no que es difícil de aprender.

+9

Su solución real supone que está disponible la opción de alejarse de Subversion. A falta de "mudarse a un nuevo trabajo", a veces no lo es. – genehack

9

Una cosa que puede estar causando problemas es que git svn dcommit volverá a escribir 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.

+0

vitorearon, ya que esta es probablemente la causa real del problema, al menos según mi comprensión del problema. –

1

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 

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

git checkout -b dummy 

A continuación, puede clonarlo (git clone ...) en otro repositorio git pura, modificarlo, cometerlo (git commit) y empuje (git push) en el repositorio git-svn.

de nuevo al repositorio git svn:

git checkout master 
git svn dcommit 

se comprometan todos los envíos git que han sido empujados.

+0

Esto no aborda la pregunta. No tienes un dir de git separado cuando haces lo que escribes. –

2

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. Con el fin de 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 se desencadenan por cada svn commit y git push. De esta forma, SubGit convierte cualquier modificación entrante.

Véase también la comparación con git-svn.