git svn - migrar - Combina las confirmaciones locales de Git en una confirmación para git-svn
git-svn download (6)
Actualmente, cuando ejecuto git svn dcommit
git crea un commit separado en SVN para cada commit local que he hecho desde la última sincronización con SVN. ¿Existe alguna forma para que dcommit
en su lugar todas mis confirmaciones locales recientes en una confirmación para SVN?
Cuando trabajo con git-svn y quiero que una serie de confirmaciones de git aparezcan como un solo compromiso, trabajo en una rama de tema y luego hago una merge
avance rápido en el master antes de dcommit
-ing.
Primero, vuelva a ajustar su rama contra svn y asegúrese de que el maestro local esté actualizado:
git svn rebase && git push . remotes/trunk:master
Luego cambia a master, merge y dcommit:
git checkout master
git merge <branch> --no-ff -m "Message you want in svn"
git svn dcommit
Esto aparecerá como un solo compromiso en Subversion, pero aún tendrá su historial local que lo llevó a ese compromiso.
+--- Merge commit
V
svn trunk *---*---*-------------------*--- --- ---
/ /
topic branch *---*---*---*---*
Eso no está funcionando para mí. Uso merge --no-ff --no-commit
pero después de commit, obtuve:
svntrunk 54f35e4 [trunk: ahead 336] release 1
dcommitting to trunkwill commit the 336 commit.
el reinicio, etiquetado y aplastamiento como se describe en la respuesta # 2: Combinar las confirmaciones locales de Git en una confirmación para git-svn funcionará, ¡pero en la próxima "fusión" tendrá algunos problemas para reunir todas las confirmaciones nuevamente!
el único que está trabajando para mí:
git checkout -tb svntrunk remotes/trunk
git merge --no-commit --squash master
para obtener todas las confirmaciones de master a svn sin perder el historial para futuras combinaciones con el mismo comando
~ Marcel
Esto funcionó para mí, aplastó varias confirmaciones en una confirmación y luego se envió a svn:
http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
No, pero puedes aplastar todos los compromisos con bastante facilidad. Para el siguiente ejemplo, voy a suponer que estás en la rama master
correspondiente a la rama del trunk
remoto y que quieres aplastar todas las confirmaciones locales juntas:
git tag local # create a temporary tag
git reset --hard trunk
git merge --squash local
git commit # write your single commit message here
git svn dcommit
git tag -d local # delete the temporary tag named local
En lugar de usar una etiqueta temporal, también podría usar el reflog (es decir, usar master@{1}
en lugar de local
)
Una forma más simple podría ser (si tiene múltiples confirmaciones apiladas en su sistema local):
git reset <hash tag of commit till which u need to combine>
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used.
git rebase remotes/trunk --interactive
debería llevarlo al menú donde puede seleccionar confirmaciones o aplastarlas todas en 1 confirmación para evitar contaminar su repositorio svn. This es un recurso realmente bueno (pero corto) para trabajar con git-svn.