Purgar datos del historial de git en un proyecto grande

Me pregunto cuáles son los efectos secundarios del uso de git filter-branch ... 'git rm ..' para purgar datos del historial del repository (ver este enlace ) son para un gran proyecto distribuido.

Nuestro proyecto se basa en github, donde hay varios tenedores importantes que tienen muchos usuarios, y me gustaría minimizar el impacto.

¡Gracias!

EDITAR: Mi objective es eliminar datos confidenciales. Si bien no es necesario "volver a colocar al gato en la bolsa", es importante que lo eliminemos del repository.

No dice por qué quiere purgar los datos, pero hay dos razones principales.

El primero (y el más común en mi experiencia) es que tienes información delicada para eliminar. De hecho, para eso usa la página que enlazó para su título.

En un proyecto grande y ampliamente distribuido, lo evitaría fuertemente.

  • Esto invalida las identificaciones de los commits, causando grandes dolores de cabeza (ver a continuación) para cada queueborador.
  • La información que intenta proteger ya está disponible y debe considerarse automáticamente comprometida.

El hecho de que este es un repository grande con muchos tenedores y queueboradores simplemente hace que estos puntos sean más importantes. En lugar de reescribir el historial del proyecto, solo elimine los files en todas las sucursales activas, cambie las keys / passwords / lo que sea, y continúe.

La otra razón principal para purgar datos es networkingucir el tamaño de su repository, por ejemplo, para que quepa en el límite de tamaño de repository de GitHub. Si este es su objective, es posible que no tenga tantas opciones, ya que hay muchas maneras de hacerlo.

Editar sobre la modificación del historial compartido:

Este es el principal problema con la modificación del historial compartido: el hash de un compromiso se calcula en function de varias cosas, incluido el contenido del file, la timestamp del compromiso, el post de confirmación y el hash de los commits principales.

Esa última es importante: si modificas una confirmación de alguna manera, su hash cambia. Si el commit de un commit cambia, todos los hash de sus commits cambian .

Entonces imagina tu repository. Hay muchas y muchas copys de todo el lugar. Cada queueborador en cada fork tiene una copy, y cada una de esas copys comparte el historial. Cuando realiza commits a GitHub, pueden resolverse contra las confirmaciones existentes de GitHub porque el gráfico formado por las confirmaciones es el mismo. Tiene la misma estructura y todos los hash de confirmación antiguos coinciden. Y cuando fetch de GitHub, la misma lógica me permite get confirmaciones actualizadas. Cada copy ahorquillada funciona con el mismo principio.

Ahora imagine que usa filter-branch en la twig master de su repository para eliminar algún file. La confirmación más temprana que contiene ese file se cambiará, y así se comprometerán todos los demás descendientes . Ahora intenta actualizar GitHub, pero no puede porque la actualización no puede resolverse contra la networking de commit de GitHub. Los hashes de confirmación ya no coinciden. Tienes que push --force .

Pero después de push --force sus cambios, cada otra copy del repository ahora contiene confirmaciones que ya no coinciden con el historial anterior . Cada copy de cada horquilla fallará en la merge --ff-only en merge --ff-only . Cada copy de cada horquilla debe actualizarse para coincidir con su nuevo y diferente historial. Probablemente de forma manual.

Que puede, en teoría, ser logrado. Si solo hay unas pocas copys del repository, incluso puede ser manejable. Pero con un repository público exitoso, con muchos tenedores, ¿cómo coordinarás ese esfuerzo alguna vez? Cada usuario tendrá que saltar a través de aros, fusionando manualmente el origin/master , que ahora se ha separado radicalmente del master , solo para acomodar sus cambios. ¿Alguna vez has intentado fusionar dos twigs que divergieron hace mucho time? No es divertido.

Y si esos usuarios tienen trabajo sobre la marcha, se rebase del master con un trabajo que aún no se ha fusionado, tendrán que rebase a establecer la rebase ese trabajo en la nueva sucursal. Y testing de nuevo. Y asegúrese de coordinar esos cambios con todos los demás que se encargan de sus cambios.

Básicamente, todo el trabajo en todas las twigs en todas las horquillas deberá congelarse hasta que este process sea resuelto.

E incluso después de todo eso, sus files confidenciales todavía se han filtrado . Algunos usuarios no pueden eliminar sus copys de esos files, o pueden haber copydo sus passwords o keys. Los files viejos pueden almacenarse en caching en algún server. La información en esos files todavía está comprometida, y ninguno de los trabajos que ha realizado lo cambia de ninguna manera.

Una opción mucho, mucho mejor es admitir cualquier error que hayas cometido, presentar un compromiso nuevo para revertirlo, dejando que todos los ancestros se comprometan tal como están y sigan adelante.

Y la única forma de lidiar con su información filtrada es cambiarla.