2011-08-25 6 views
29

Cuando comencé mi repositorio git, confié algunos archivos como compromiso inicial. Ahora, muchos commits más tarde, noté que incluí en esos archivos una línea con información que no quiero publicar (a diferencia del resto del código). Así que quiero eliminar/cambiar esta una línea y mantener el resto del código.git: cambiar una línea en el archivo para el historial completo

Buscando alrededor Encontré esta solución: inserte un compromiso vacío como confirmación inicial (descrito aquí: Insert a commit before the root commit in Git?), haga una rebase en él y luego edite el primer compromiso anterior a través de la enmienda. Desafortunadamente, muchos conflictos de fusión crueles surgen durante la rebase (como se describe aquí: git: solving conflicts caused by rebase).

¿Hay alguna manera diferente de resolver mi problema o tiene que volver a clasificar y editar todos los conflictos a mano?

Gracias de antemano :)

Tibo

+0

Si se acaba de cambiar una línea, los conflictos de fusión debe ser bastante pequeña. – Clueless

+0

posible duplicado de [¿Cómo puedo eliminar archivos confidenciales del historial de git] (http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history) –

+0

@Clueless: los conflictos surgen cuando se rebase, estos son conflictos que resolví en el pasado – tbolender

Respuesta

38

Aquí hay un comando que se retire una línea ofensiva de la historia de un archivo en todas sus sucursales:

git filter-branch --tree-filter 'sed -i "/sensitive information/ d" filename' -- --all 

Esto verifica todas las revisiones, ejecuta el comando sed y luego confirma esa revisión.

El comando sed en este caso coincide con cualquier línea que contenga el patrón sensitive information en el archivo llamado filename y elimina esas líneas.

Nota: es bueno si tiene una copia de seguridad, y pruebe primero el script sed para asegurarse de que está haciendo lo que quiere, ya que puede llevar bastante tiempo ejecutarlo en un largo historial.

+0

¿Hay alguna posibilidad de ignorar un error de sed (por ejemplo, cuando un archivo no existe en una revisión)? – tbolender

+3

No sé si la opción '-q' hace eso o no. Es posible que deba envolverlo en un shell si, entonces, como 'if [-e file]; luego sed ...; fi' –

+0

Uso de shell si funcionó para mí :) – tbolender

4

Hice este comando que no error cuando no existe un archivo:

filename=./path/to/your/filename 
filter=your_regex_here 

git filter-branch --tree-filter 'test -f $filename && sed -i.bak "/$filter/d" $filename || echo “skipping file“' -- --all 
Cuestiones relacionadas