Digamos que introduje <feature.c> hace un tiempo y ahora noto que no debería haber sido parte de mi rama main
sino más bien una rama feature
. ¿Es posible usar, p. git-filter-branch
para mover automáticamente todos <feature.c> 's historia de mi main
rama en la rama feature
?git: Dividir el historial de algunos archivos en una rama separada
Respuesta
¡Parece que estás haciendo algo bastante loco! :)
Dicho esto, veo algunas opciones, ninguna de las cuales es particularmente automática.
Si usted tiene un montón de confirmaciones con ese archivo está presente, simplemente admitir el error, crea una nueva rama fuera de su cabeza, y poner aún más las confirmaciones con esa característica en esa rama hasta que estén estables . Si su repo es compartido, esta se convierte en la única opción real. Nadie quiere tener una historia divergente, especialmente si esa característica se cometió en lo profundo de la historia.
Si sólo está hablando de 10 o menos se compromete a que en realidad han tocado ese archivo, y son relativamente poco tiempo, sin muchos cometidos otra confirmación intercalada, se puede comprobar a cabo una nueva rama en la cabeza, y revertir la rama no desea volver a esta función antes de agregar la función, y luego seleccionar las confirmaciones que necesita de la rama de características hasta que esté listo para enviarlas todas en una fecha posterior.
Si usted está tratando con un montón de historia, un montón de intercalado comete, y que realmente no quiere tener esa característica presente en todos, usted podría escribir un script de shell poco que toma la salida de
git log
y cherry lo recoge en una nueva sucursal. Algo a lo largo de las líneas de:$ cd git-repo $ git checkout -b feature-x $ the-perfect-shell-script `git log --pretty=format:"%H" path/to/feature.c`
vez que haya esa rama de la característica con toda la cereza compromete elegido, a continuación, puede utilizar
git filter-branch
para filtrar todas las confirmaciones que hacen referencia a ese archivo. El man page tiene un ejemplo simple que hace exactamente eso.Una vez que tenga eso, puede entonces
git rebase feature-x --onto <filtered-branch>
y debería estar listo para empezar.Por supuesto que debería ser bastante desaconsejado, especialmente si cualquiera de eso se publica.
Ok, aquí está mi ir:
si yo no se compromete la manipulación <feature.c>, podría haber ramificado de <feature.c> 's primero comprometerse y luego se usa git cherry-pick
con git log
en un bucle, como suggested por Tim Visher. A partir de maestro que supongo que esto debería funcionar:
#!/bin/bash
# create the feature branch starting from feature.c's first commit
FIRSTCOMMIT=$(git log --pretty=format:"%H" feature.c | tail -n1)
git checkout -b feature $FIRSTCOMMIT
# find all commits concerning feature.c...
for i in $(git log feature..master --reverse --pretty=format:"%H" feature.c)
do
# ... cherry-pick them ...
git cherry-pick $i
# ... and copy ONE modified tag of it if existing
git describe --tags --exact-match $i && xargs taghelperscript
done
# now eliminate feature.c from master
git filter-branch --prune-empty --tag-name-filter "cat" --index-filter 'git rm --cached --ignore-unmatch feature.c' $FIRSTCOMMIT..master
Con taghelperscript
siendo algo así como git tag prefix.$1
(tal vez esto se puede hacer mejor?). La parte de etiquetado probablemente solo funcione para las etiquetas livianas que uso. También tenga en cuenta que esto no funciona si la característica <.c > ha sido renombrado en algún momento, y si ya existía en la confirmación inicial esto podría causar dos historias separadas, o (mi conjetura) una confirmación en master
que contiene la eliminación de <feature.c> que es probable que cause un conflicto de fusión o confusión posterior.
El problema es que algunos de mis compromete modificar otros archivos, lo que provoca git cherry-pick
para desencadenar una fusión sin resolver, o introduce estos otros archivos. Entonces, en cambio, probaré un poco de magia git filter-branch
. Más tarde. Estén atentos ...
- 1. git branch Dividir en repo separada
- 2. Git: ignorar algunos archivos durante una combinación (mantener algunos archivos restringidos a una rama)
- 3. Dividir archivos manteniendo el historial en SVN
- 4. git problema - quedó separada de la rama
- 5. Eliminar archivos eliminados del historial de git
- 6. ¿Cómo cerrar una rama SIN eliminarla del historial en git?
- 7. Mantener el historial de git al dividir un archivo
- 8. git eliminar archivos de una sola rama
- 9. ¿Por qué Git no elimina algunos archivos cuando cambio de una rama?
- 10. Modificar el historial de una rama de tema git que usó fusiones para usar rebases
- 11. git branch sin historial
- 12. Quitar confirmaciones de Git en una rama
- 13. Git: 1.List todos los archivos en una rama, archivos 2.compare de diferente rama
- 14. ¿Guarda el historial de Clearcase en Git?
- 15. ¿Cómo ver el historial de archivos en Git?
- 16. ¿Hay alguna forma de purgar algunos archivos del historial de git?
- 17. ¿Cómo dividir una cadena separada por comas?
- 18. git - rama principal de bloqueo para algunos usuarios?
- 19. Dividir una matriz en algunos sub-arrays
- 20. Separar archivos en Git
- 21. cómo romper una sub-secuencia de confirmaciones Git como una rama separada + fusionar cometer
- 22. Git está perdiendo historial/contenido en archivos individuales
- 23. git clonar en una rama
- 24. Al usar git, ¿cómo mueves algunos cambios no confirmados de una rama a otra rama en una carpeta diferente?
- 25. Empujar una rama de un git repo a un nuevo control remoto (github), ocultando su historial
- 26. Combinar/rebase una rama 'desconectada' en Git
- 27. ¿La eliminación de una rama en git la elimina del historial?
- 28. ¿Cómo muevo el contenido de mi rama principal a una nueva rama de Git?
- 29. Git: Cómo volver de 'cabeza separada' estado
- 30. git: Confirmar el trabajo actualmente en curso en la rama actual a una nueva rama
afortunadamente, no hay nada publicado, mi idea de la ramificación de características se produjo en el "qué considerar antes de la publicación" de la fase :) así que intentaré 3. –
+1 por 'the-perfect- shell-script 'git log --pretty = format:"% H "path/to/feature.c''. Ver [mi propia respuesta] (http://stackoverflow.com/questions/4278264/git-split-history-of-some-files-into-a-separate-branch/4283970#4283970) para mi idea de ello –
en su lugar de 'git log ...' uno también puede usar 'git rev-list master - feature.c' –