tipos - git: cambia una línea en el archivo para el historial completo
git ver archivos modificados (4)
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 línea y guardar el resto del código.
Buscando alrededor Encontré esta solución: inserte un compromiso vacío como confirmación inicial (que se describe aquí: inserte un compromiso antes de la confirmación de raíz en 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: resolver conflictos causados por rebase ).
¿Hay alguna forma diferente de resolver mi problema o tienes que volver a clasificar y editar todos los conflictos a mano?
Gracias por adelantado :)
Aquí hay un comando que eliminará una línea ofensiva del historial 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
en él y luego confirma esa revisión.
El comando sed
en este caso coincide con cualquier línea que contenga la sensitive information
al patrón en el archivo llamado filename
y borra esas líneas.
Nota: es bueno si tiene una copia de seguridad, y primero pruebe el script sed
para asegurarse de que está haciendo lo que quiere, porque puede llevar bastante tiempo ejecutarlo en un largo historial.
Hice este comando que no se equivoca cuando un archivo no existe:
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
Mi respuesta combina lo mejor de todo. Sustituye la cadena de filtro dada en lugar de la línea completa y se salta muy bien si el archivo no se encuentra en una confirmación. Hay muchas citas escapadas, pero la otra respuesta tenía citas realmente extrañas que no me funcionaron.
git filter-branch --tree-filter "test -f /"$filename/" && sed -i /"s/$filter//g/" /"$filename/" || echo /"skipping $filename/"" -- --all
Puedes echar un vistazo a git filter-branch
Los ejemplos en el enlace deberían ayudarte: http://git-scm.com/docs/git-filter-branch