2010-02-08 32 views
11

Tengo un proyecto versionado con Git que me gustaría convertir en fuente abierta, pero tiene cierta información privada que es específica del entorno en el que se usó originalmente. Voy a cambiar la información en cuestión para cargarla desde un archivo de configuración que no está incluido en el repositorio. Me doy cuenta de que debería haber hecho esto en primer lugar, pero dado que la información privada todavía existe en compromisos previos, ¿cómo puedo eliminarla de mi historial? ¿Tengo que iniciar un nuevo repositorio basado en el último compromiso y perder todo mi historial o hay una forma de salvar el repositorio actual mientras elimino cualquier registro de la información privada?Eliminando información privada del antiguo Git commits

Editar: Para aclarar, no quiero eliminar por completo los archivos que contienen esta información privada, porque todavía se utilizan. Por el contrario, quiero eliminar/borrar/cambiar la aparición de ciertas cadenas dentro de ellos.

Respuesta

2

Escribí un script para esto hace un rato. Puede encontrarlo aquí: http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/

El script se basa en la herramienta git-filter-branch que viene con git. Si tiene curiosidad, puede leer más sobre cómo eliminar archivos de un git repo here, pero usar la secuencia de comandos desde el enlace anterior debe ser fácil y todo lo que necesita para lograr eliminar esa información privada.

+0

Esto parece una gran herramienta, pero no estoy seguro de que funcione en mi caso. Debería haber sido más claro en mi pregunta, pero lo que quiero eliminar es la aparición de ciertas cadenas: no quiero eliminar por completo los archivos porque los archivos todavía se usan. –

+0

Oh, ya veo. Eso es un poco más complicado. Si ingresó estas cadenas privadas en confirmaciones que no contienen nada más que desee conservar, entonces puede usar git-filter-branch para eliminar solo esas confirmaciones (sin eliminar los archivos). Mi script no puede hacer eso por usted, pero si visita la página man de git-filter-branch, creo que verá cómo puede usarlo para eliminar las confirmaciones individuales también. –

+0

Además, debería poder usar git-filter-history para aplicar un filtro personalizado (script) sobre sus archivos. Parece que podría ser un poco más difícil que simplemente eliminar un archivo o confirmar, pero debería hacer lo que quiera (y suena mejor que reiniciar su repositorio y perder todo su historial cuando lo libere al público). –

4

Recomendaría usar el BFG Repo-Cleaner, una alternativa más simple y más rápida a git-filter-branch específicamente diseñada para eliminar datos privados de repositorios Git.

El usage instructions dar los pasos con más detalle, pero la corona de perforación es simplemente: descargar el BFG's jar (necesita Java 6 o superior) y ejecute este comando:

$ java -jar bfg.jar --replace-text replacements.txt my-repo.git 

El archivo replacements.txt debe contener todas las sustituciones que quiere hacer, en un formato como este (una entrada por línea - en cuenta los comentarios no deben ser incluidos):

PASSWORD1 # Replace literal string 'PASSWORD1' with '***REMOVED***' (default) 
PASSWORD2==>examplePass   # replace with 'examplePass' instead 
PASSWORD3==>     # replace with the empty string 
regex:password=\w+==>password= # Replace, using a regex 

Su toda la historia del repositorio será escaneado, y todos los archivos no binarios (inferior a 1 MB en tamaño) tendrá las sustituciones realizadas: se reemplazará cualquier cadena coincidente (que no se encuentre en su última confirmación).

Descripción completa: Soy el autor de BFG Repo-Cleaner.