¿Cómo puedo hacer una copy de alguna twig con identificadores hash regenerados de sets de cambios en Git?

Puedo hacer una copy de cualquier twig de varias maneras, pero tomemos:

git branch copyBranch 

Hará una nueva twig con el mismo estado que la actual.

Si desea usar el git log , puede ver que los ID hash de confirmaciones son los mismos.

Puedo regenerar en la twig de copy los nuevos identificadores usando git replace --edit con git filter-branch .

Pero quiero hacer esto de una manera más elegante. Tal vez haya un command git más simple para tal objective.

Si quieres preguntarme ¿ why do I want it?

Porque, quiero hacer una copy de las twigs, asociarlas con cierta label, regenerar identificadores para cada confirmación de la twig de file para pasar los posibles conflictos. Luego solo combine la twig original con otra y ciérrela (elimínela).

Entonces, ¿existe una forma más elegante para este comportamiento?

En cuanto a mí, quiero tener una copy / file limpio de la sucursal que tendrá los diferentes identificadores para el futuro posibles diferentes forms de trabajo.

No tiene que hacer nada más para crear una twig de "file" que git branch copyBranch .

Su " currentBranch " (que acaba de "copyr") evolucionará de forma independiente: tal vez habrá una rebase que cambiará su SHA1, pero eso no tendrá ningún efecto en su twig de copy.

Supongamos que elimina una confirmación (a través de una rebase –interactive) en su twig actual, aquí está el resultado:

 A--B--C (currentBranch, copyBranch) 

Para (después de git rebase -i ):

 A--B--C (copyBranch) \ C' (currentBranch) 

¿Ver? ¡Tu sucursal actual tendrá diferentes SHA1! (para la parte que ha sido rebasada).

No es necesario trabajar en el SHA1 del copyBranch : permanecerán "archivados" (referencedos por el copyBranch HEAD) sin cambios para siempre.
Mientras que su currentBranch cambiará según sea necesario.

Restaurar el copyBranch será trivial.

Puedes usar esto:

https://rtyley.github.io/bfg-repo-cleaner/

¡Es mucho más rápido la filter-branch 10-720 veces más rápido!

El BFG actualizará sus confirmaciones y todas las twigs y tags para que estén limpias, pero no elimina físicamente las cosas no deseadas.

Examine el repository para asegurarse de que su historial haya sido actualizado, y luego use el command estándar git gc para eliminar los datos sucios no deseados, que ahora Git reconocerá como un excedente de los requisitos.

Puede usarlo para hacer lo que desee y no solo para eliminar datos.


¿Cómo lo hace el BFG más rápido que git-filter-branch?

git-filter-branch realiza un seguimiento de cada confirmación en su historial, ejecutando los scripts de shell que le dio contra el contenido -el tree de files completo- de cada confirmación (para que pueda escribir un script bash para, por ejemplo, eliminar un file), y esto te da una gran cantidad de poder. Demasiado poder.

Cada vez que te comprometas a limpiar, solo habrá cambiado una pequeña cantidad de datos, pero tu secuencia de commands bash se está ejecutando en todo el tree de files de la confirmación. Estás limpiando los mismos malditos files una y otra vez. Eso es lento y, en términos generales, totalmente extraño.

Recuerde que para un set dado de contenido de files, ese file solo se almacenará una vez en el Git DB. Recuerde que una carpeta que contiene files y subcarpetas solo se almacenará una vez, si los files y subcarpetas no han cambiado. ¿Por qué limpiar esos files precisos más de una vez? Git te ruega que no te repitas.

Esta es la idea de The BFG: Limpiar un object determinado Git una vez. Recuerde el resultado: guarde la identificación "sucia" y la "limpia" en un map simple, y cada vez que encuentre un object (file o carpeta) mientras limpia una confirmación, verifique su identificación para ver si la ha limpiado antes , y si tiene, simplemente use el object limpio que almacenó desde la última vez. Con frecuencia, obtienes una gran ganancia y no es necesario limpiar una subcarpeta masiva, porque ya tienes la ID de Git de lo que parece cuando se ha purgado.

Este tipo de estructura también es muy compatible con el paralelismo, por lo tanto, si bien debe limpiar confirmaciones en order, todavía puede despedir a una tonelada de trabajadores paralelos para limpiar el contenido de sus files y get un buen uso de todos los núcleos de CPU en su computadora.

Si está interesado principalmente en limpiar files grandes, también puede probar la solución de github en files de gran tamaño: https://git-lfs.github.com/