BFG está eliminando contenido sensible en todas partes, pero en el penúltimo compromiso

Estaba intentando eliminar un par de líneas de un file de mi historial que contenía un token de API secreto y algún punto final que se pasa mucho mejor como variables de entorno que codificadas allí, así que si hago público el repository algún día, no estarán allí para los ojos indiscretos.

He utilizado para este fin la herramienta increíble que es el limpiador de repositorys BFG, que también utilicé en el pasado para eliminar files residuales y sensibles completos de mi historial de git. Esta vez siguiendo las instrucciones para replace el text:

$ java -jar ~/bfg.jar --replace-text tokens.txt myRepo.git 

Pero en la salida, esto apareció:

 ... * commit 10134503 (protected by 'HEAD') - contains 1 dirty file : - app.py (640 B) ... If you *really* want this content gone, make a manual commit that removes it, and then run the BFG on a fresh copy of your repo. 

Así que hice exactamente eso, cloné todo, realicé un compromiso al replace las dos líneas que quería para 2 llamadas a os.environ[] en python y lo os.environ[] . Luego volví a ejecutar BFG, git reflog y todo parecía funcionar como un amuleto.

Verifiqué en el browser de commit de gitlab y el text estaba ***REMOVED*** todas partes excepto en el penúltimo commit, donde sucedió esto:

img

Supongo que sucedió porque el file se editó en el próximo commit (ahora el protegido por 'HEAD') y GIT necesita esos tokens para recrear los cambios que hice para deshacerse de esas 2 líneas. Pero entonces, ¿cómo logro esto?

Reescribir la historia de Git es un asunto complicado, en el que es muy fácil para los usuarios cometer errores oscuros que niegan lo que están tratando de hacer. Como autor de BFG, he dedicado mucho time a evaluar los informes de los usuarios, tratando de descubrir por qué han sucedido cosas extrañas. El BFG es solo el paso intermedio en el process de limpieza de un repository, y hay mucho espacio para el error del usuario en los pasos anteriores y posteriores: es bastante raro que haya un error en el propio BFG * .

Entonces, si entiendo tu descripción correctamente, tu historial de commit ahora se ve así (el más antiguo primero, el último más reciente):

  • ...cleaned commits containing ***REMOVED*** where the cnetworkingentials used to be
  • a penultimate commit where the unwanted cnetworkingentials *are* present
  • the 'manual' cleaning commit where you instead read cnetworkingentials from os.environ[]

Veamos tus acciones:

Así que hice exactamente eso, cloné todo, realicé un compromiso al replace las dos líneas que quería para 2 llamadas a os.environ [] en python y lo apreté. [X] Luego volví a ejecutar BFG, git reflog y todo parecía funcionar como un hechizo. [Y]

El asunto es que tu historial de confirmaciones en GitLab en X sería exactamente lo que informa tu historial de commit final en GitLab. Entonces, entre X e Y nada cambió en GitLab.

Entonces, dos posibles explicaciones:

  • Hay un error en el BFG ( como sugirió @torek ) – Me encantaría ver un caso de testing simple que demuestre esto
  • el último bash de git push en Y simplemente no sucedió o falló, por ejemplo porque --force no se usó.

Si pudieras intentar ejecutar el BFG nuevamente en un clon de espejo nuevo de tu repository, podríamos eliminar una de esas opciones.

Finalmente:

Supongo que sucedió porque el file se editó en el próximo commit (ahora el protegido por 'HEAD') y GIT necesita esos tokens para recrear los cambios que hice para deshacerse de esas 2 líneas.

Las tiendas de Git se comprometen como instantáneas completas de su tree de files con cada confirmación, no las almacena como la diferencia que podría pensar que usaría. Así que no te preocupes, Git no necesita esas cnetworkingenciales antiguas para crear la confirmación final hecha a mano (donde las cnetworkingenciales se leen desde os.environ[]) .

Por cierto, el BFG fue diseñado con el model de comportamiento del usuario "reformado-alcohólico" : se supone que debes ejecutar el BFG una vez que te hayas dado count de que tienes un problema y te hayas limpiado, así que asegúrate de que el último compromiso en tu repository está limpio antes de ejecutar el BFG.

* Definitivamente existen condiciones que hacen que el BFG muera con una exception fatal, pero no hay errores que sepa de dónde el BFG realmente completó una carrera y se comportó fuera de especificaciones.