git pierde la ruta del historial entre las tags SVN

Mi git repo está rastreando un repository SVN. Una de las sucursales de git, llamémosla 'latest_tag', apunta al código fuente tal como está en la última label SVN. Cuando se crea una nueva label SVN, quiero fusionar los cambios en 'latest_tag'. Cuando trato de hacer esto, git se queja de los conflictos de combinación, como si no entendiera el historial de SVN.

El repository SVN está usando la estructura estándar.

  el maletero/
 tags /
  - v1
 twigs / 

Creé mi git repo de la manera habitual.

git svn clone --stdlayout url_to_svn_repo git_repo 

Creé twigs git para cada label SVN y una twig 'latest_tag'.

 git branch v1 tags/v1 git branch latest_tag v1 

Cuando se agrega una nueva label en el repository de SVN (por ejemplo, v2), puedo importarla en mi repository git.

 git svn fetch git branch v2 tags/v2 

Pero si trato de adelantar la twig 'latest_tag' de v1 a v2, aparece un error.

 $ git checkout latest_tag $ git merge v2 Auto-merging source.py CONFLICT (add/add): Merge conflict in source.py Automatic merge failed; fix conflicts and then commit the result. 

Cuando miro el conflicto, parece que git considera que todos los cambios entre v1 y v2 no están relacionados, aunque tienen una historia común.

Aquí hay un script mínimo que recrea el problema.

 # Create the svn repo and its first tag. svnadmin create svn_repo/ svn checkout "file:///${PWD}/svn_repo/" svn_working_copy ( cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ; ) # Create a git repo from the svn repo. git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo ( cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1 ) # Create tag v2 in svn. ( cd svn_working_copy ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2' ) # Merge or rebase 'latest_tag' git branch on svn tag v2. ( cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2 ) 

EDITAR Confirmo que git parece no tener sentido de la historia común entre dos tags SVN.

 $ git log --oneline master bd050cd Development for v2 373f808 Development for v1 3b92703 Initialize SVN repo $ git log --oneline remotes/tags/v1 31f9fff Tag v1 3b92703 Initialize SVN repo $ git log --oneline remotes/tags/v2 b717759 Tag v2 3b92703 Initialize SVN repo 

Si git entendió el historial de SVN, generaría esto.

 $ git log --oneline remotes/tags/v1 31f9fff Tag v1 373f808 Development for v1 3b92703 Initialize SVN repo $ git log --oneline remotes/tags/v2 b717759 Tag v2 bd050cd Development for v2 373f808 Development for v1 3b92703 Initialize SVN repo 

Descubrí por qué git parecía no tener sentido de la historia de svn. La respuesta es: depende de cómo crees tu label svn.

Al observar el historial de svn, vi que las tags svn se creaban como una composition de files de varias revisiones, en lugar de crearse como una instantánea de una revisión determinada.

 $ svn log -v ------------------------------------------------------------------------ r3 | lacton | 2013-07-27 18:15:20 | 1 line Changed paths: A /tags/v1 (from /trunk:1) A /tags/v1/source.py (from /trunk/source.py:2) Tag v1 ------------------------------------------------------------------------ 

Aunque svn parece perfectamente feliz con esto, git-svn se confunde con esto.

Agregar una svn update antes de hacer la creación de la label corrige este problema.

 $ svn up At revision 2. $ svn cp trunk/ tags/v1 A tags/v1 $ svn commit -m 'Tag v1' Adding tags/v1 Committed revision 3 $ svn up At revision 3. $ svn log -v -r HEAD ------------------------------------------------------------------------ r3 | lacton | 2013-07-27 18:20:26 | 1 line Changed paths: A /tags/v1 (from /trunk:2) Tag v1 ------------------------------------------------------------------------ 

Con esta corrección, git-svn interpreta el historial de tags de svn correctamente y ya no hay un conflicto de fusión.

Aquí está la versión "compatible con git" (es decir, con la svn update antes de la creación de la label) del script mínimo provisto con la pregunta inicial.

 # Create the svn repo and its first tag. svnadmin create svn_repo/ svn checkout "file:///${PWD}/svn_repo/" svn_working_copy ( cd svn_working_copy ; mkdir -p trunk tags branches ; svn add * ; svn commit -m 'Initialize SVN repo' ; cd trunk ; echo "print 'Hello v1'" >source.py ; svn add * ; svn commit -m 'Development for v1' ; cd .. ; svn up ; svn cp trunk/ tags/v1 ; svn commit -m 'Tag v1' ; sed --in-place 's/v1/v2/' trunk/* ; svn commit -m 'Development for v2' ; ) # Create a git repo from the svn repo. git svn clone --stdlayout "file://${PWD}/svn_repo/" git_repo ( cd git_repo ; git branch v1 tags/v1 ; git branch latest_tag v1 ) # Create tag v2 in svn. ( cd svn_working_copy ; svn up ; svn cp trunk/ tags/v2 ; svn commit -m 'Tag v2' ) # Merge or rebase 'latest_tag' git branch on svn tag v2. ( cd git_repo ; git svn fetch ; git branch v2 tags/v2 ; git checkout latest_tag ; git merge v2 )