with subversion software guide full commands branches and git svn merge git-svn mergeinfo

subversion - git-svn workflow para combinar utilizando svn.pushmergeinfo



migrate svn to git with branches (1)

¿Cuál es el flujo de trabajo correcto para fusionar ramas rastreadas svn usando git-svn? He leído un poco sobre la clave de configuración git-svn svn.pushmergeinfo, y las advertencias son:

De http://www.kernel.org/pub/software/scm/git/docs/git-svn.html :

clave de configuración: svn.pushmergeinfo

Esta opción hará que git-svn intente llenar automáticamente la propiedad svn: mergeinfo en el repositorio SVN cuando sea posible. Actualmente, esto solo se puede hacer cuando se realizan fusiones no rápidas donde todos los padres, excepto el primero, ya han sido insertados en SVN.

Entonces mi flujo de trabajo normal es:

Suponiendo que tengo una rama SVN ^ / branches / feature_branch

# Ensure git-svn is configured to populate svn:mergeinfo git config --global svn.pushmergeinfo true # Update my local svn remotes state git svn fetch # Track a local branch against a remote SVN backed ^/branches/feature_branch git checkout -b local_feature_branch remotes/feature_branch # Modify files and commit to local git repo git commit -a -m "changes" # Push changes to SVN branch ^/branches/feature_branch git svn dcommit

Entonces para fusionar ^ / trunk en mi local_feature_branch, ¿supongo que hago algo así?

# Sync to the latest SVN git svn fetch # Rebase "master" which is tracking the remote SVN ^/trunk git checkout master git svn rebase # Checkout the local_feature_branch git checkout local_feature_branch # Merge "master" into "local_feature" which is tracking ^/trunk git merge --squash master git commit -m "merge master which is tracking SVN ^/trunk" # Dry run the dcommit to SVN which should include svn:mergeinfo property changes git svn dcommit --dry-run # Commit merge to trunk git svn dcommit


Usar fusionar --squash y svn.pushmergeinfo juntos no tiene mucho sentido. Con merge --squash, la confirmación resultante no será una confirmación de fusión, por lo que un compromiso posterior no creará ninguna mergeinfo.

Sé que los hilos (en su mayoría más antiguos) aquí en sugieren el uso de --squash, pero creo que en gran medida es una reliquia del pasado. He estado usando git-svn para gestionar los repos svn de nuestra empresa durante casi un año, y hasta ahora funcionaba muy bien con el siguiente flujo de trabajo:

Siempre me aseguro antes de la fusión de que estoy actualizado y, para estar a salvo, no tengo compromisos locales no sincronizados:

# On local_feature_branch # Update from SVN git svn fetch && git svn rebase -l # push pending commits git svn dcommit

Luego hago una fusión ''real'', usando la rama SVN "remota" como fuente. Esto ahorra el cambio de ramas y la actualización, y asegura que la bifurcación entrante no tenga ningún commit unsynced local:

# Create a real, non-forward merge commit git merge --no-ff svn/trunk # ... and push it to SVN, including mergeinfo git svn dcommit

Además, de esta manera la fusión se registra correctamente en la historia local, por lo que las fusiones posteriores no tendrán que lidiar con conflictos resueltos previamente. Con --squash te reunirías de nuevo con cada fusión.

Sin embargo, tenga en cuenta que existe un problema abierto con mergeinfo cuando se fusiona de local_feature_branch a trunk (es decir, se reintegra en svn-speak): Git-SVN con svn.pushmergeinfo: cómo evitar la referencia automática de las líneas mergeinfo . Esto ha sucedido rara vez en nuestro repositorio, pero hasta ahora no me ha causado ningún problema.