Tengo una serie de parches comprometidos localmente en mi repo de git-svn que todavía no he comprometido con nuestro repositorio svn. Un "git svn dcommit" normal enviará todos estos parches a svn. Me gustaría comprometer solo algunos de mis parches (correcciones de errores simples), pero no otros (cambios importantes no probados). ¿Cómo puedo hacer esto con git svn?¿Cómo comprometer solo parches seleccionados con git svn?
Respuesta
Esto es lo que terminé haciendo. El punto de partida es la rama "principal" sincronizada con svn, con todos mis parches locales en la parte superior.
Cree una nueva rama (wip = Work In Progress).
git branch wip
Esto hace una copia de la rama actual, incluidos todos los parches que aún no están comprometidos con svn. La rama actual permanecerá como "maestra" y no se cambiará.
Retire los parches locales no deseados de "maestro" con un rebase:
git rebase -i HEAD~10
Ahora la rama "master" tiene parches puede comprometerse con seguridad:
git svn dcommit
El "trabajo en curso" la sucursal ahora tiene los cambios principales que aún no están listos para compartir. En realidad, quiero que se queden allí y aquí es donde detendría. Es posible hacer el svn dcommit desde la rama "wip" una vez que todo está finalizado. Pero por el bien completess', y para responder a la pregunta original, hay un paso final:
Tire los cambios no confirmados de nuevo a la rama 'master' usando
git cherry-pick
y finalmente eliminar la rama inútil congit branch -d wip
.
Con git, en realidad no se supone que opere en conjuntos de cambios individuales. El mejor enfoque que conozco es crear sucursales locales para cualquier trabajo no trivial. De esta forma, tus principales cambios no probados terminarán en diferentes ramas de tu repositorio de git, y podrás diferenciarlos bastante fácilmente.
Si este es el problema que tiene en este momento, probablemente pueda crear crear una nueva rama desde el último punto que actualizó desde svn y luego usar git-cherry-pick para transferir sus correcciones de errores a esta nueva rama, desde la cual puede comprometerse con svn.
Desde una perspectiva más a largo plazo de vista lo mejor es tener su propia rama "master" hecha de tronco de la subversión, y luego o bien:
- rebase todas sus ramas cada vez que actualice desde SVN, a continuación, fusiona los que quieres para svn con tu maestro y comprométete desde allí.
- Combina cosas de svn usando git-merge normal, y luego fusiona cosas a tu master para dcommits por
git diff ..my_branch | patch -p1
, lo que eliminará el historial que git-svn no puede manejar. Este enfoque es más complicado para la fusión final, pero le permite fusionar cosas entre sucursales (y posiblemente otras personas) en git.
He estado siguiendo el procedimiento aquí:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
Si estás cómodo cambio de base, funciona bastante bien.
- 1. ¿Cómo funcionan los parches en Git?
- 2. Git Diff - Cómo revertir líneas o fragmentos seleccionados
- 3. git format-patch sin comprometer
- 4. Git comprometer ganchos por rama
- 5. Mercurial (hg) comprometer solo ciertos archivos
- 6. git-svn branching: cómo configurar git config
- 7. ¿Cómo comprometer solo archivos modificados (y no nuevos o eliminados)?
- 8. Git: ¿Cómo crear parches para una combinación?
- 9. gitolite: permite cambiar solo los archivos seleccionados
- 10. Extensiones de Git utilizables con repositorios SVN?
- 11. ¿Puedo comprometer solo partes de mi código usando SVN o Mercurial?
- 12. ¿Para qué se utilizan parches en SVN?
- 13. Cómo aplicar git diff - ¿parches binarios sin git instalados?
- 14. Git-SVN con múltiples sucursales?
- 15. Clonar varios proyectos SVN con git-svn
- 16. Git SVN con archivos binarios
- 17. ¿Cómo se configura svn ignore settings con git svn?
- 18. git add. -> todavía "nada para comprometer" con nuevos archivos
- 19. ¿Cómo resolver un conflicto con git-svn?
- 20. ¿Debería comprometer .gitignore en los repositorios Git?
- 21. ¿Parches de contribución de Mercurial a Git?
- 22. Usando git-svn (o similar) * solo * para ayudar con una combinación de svn?
- 23. escogiendo cereza con git-svn
- 24. ¿Cómo comprometer un directorio en un repositorio de git?
- 25. ¿Cómo revertir dos confirmaciones y comprometer solo cosas buenas?
- 26. Visor de parches de formato Git?
- 27. Empujando sin comprometer
- 28. ¿Cómo se usa git svn?
- 29. crear una nueva rama svn con git-svn
- 30. Compilación solo de archivos seleccionados en Maven
El último paso aquí es "git pull. Wip" que simplemente saca todos los cambios de la rama wip, para satisfacer la pregunta original, se necesitaría el uso de git-cherry-pick. –
Mark, gracias por señalar eso; He editado la publicación para usar cherry-pick en su lugar. El uso de "git pull. Wip" seguido de "git svn rebase" generalmente resolverá automáticamente los conflictos, pero es mejor usar cherry-pick. –