En primer lugar, debe cambiar la contraseña en el sitio FTP. La contraseña ya se ha hecho pública; no puede garantizar que nadie haya clonado el repositorio, o que no esté en texto sin formato en una copia de seguridad en alguna parte, o algo por el estilo. Si la contraseña es valiosa, la consideraría comprometida por ahora.
Ahora, para su pregunta sobre cómo editar el historial. El comando git filter-branch
está destinado a este fin; recorrerá cada commit en el historial de su repositorio, aplicará un comando para modificarlo y luego creará un nuevo commit.
En particular, usted quiere git filter-branch --tree-filter
. Esto le permite editar el contenido del árbol (los archivos y directorios reales) para cada confirmación. Ejecutará un comando en un directorio que contiene todo el árbol, su comando puede editar archivos, agregar nuevos archivos, eliminar archivos, moverlos, etc. Git luego creará un nuevo objeto de confirmación con todos los mismos metadatos (mensaje de confirmación, fecha, etc.) como el anterior, pero con el árbol modificado por su comando, tratando los nuevos archivos como agregados, archivos perdidos como borrados, etc. (por lo tanto, su comando no necesita hacer git add
o git rm
, solo necesita modificar el árbol).
para sus propósitos, algo así como lo siguiente debería funcionar, con la expresión regular apropiada y el nombre dependiendo de su situación exacta:
git filter-branch --tree-filter "sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py" -- --all
Recuerda hacer esto de una copia de su repositorio, así que si algo sale mal, todavía tendrá el original y puede comenzar de nuevo. filter-branch
también guardará las referencias a sus ramas originales, como original/refs/heads/master
y así sucesivamente, por lo que podrá recuperar incluso si olvida hacerlo; Cuando hago alguna modificación global en mi historial de código fuente, me gusta asegurarme de tener múltiples resguardos en caso de que algo salga mal.
Para explicar cómo funciona esto en más detalle:
sed -i -e 's/SekrtPassWrd/REDACTED/' myscript.py
Esto reemplazará SekrtPassWrd
en su archivo myscript.py
con REDACTED
; La opción -i
de sed
le dice que edite el archivo en su lugar, sin ningún archivo de copia de seguridad (ya que Git lo recuperaría como un archivo nuevo).
Si necesita hacer algo más complicado que una sola sustitución, puede escribir una secuencia de comandos e invocarla para su comando; solo asegúrese de llamarlo con una ruta de acceso absoluta, ya que git filter-branch
llama a su comando desde un directorio temporal.
git filter-branch --tree-filter <command> -- --all
Esto le dice git
para ejecutar un filtro de árbol, como se describió anteriormente, sobre todas las ramas en su repositorio. La parte -- --all
le dice a Git que aplique esto a todas las ramas; sin él, solo edita el historial de la rama actual, dejando sin cambios todas las otras ramas (que probablemente no es lo que desea).
Consulte la documentación en GitHub en Removing Sensitive Data (como originally pointed out by MBO) para obtener más información sobre cómo tratar las copias de la información que se envió a GitHub. Tenga en cuenta que reiteran mi consejo de cambiar su contraseña y brindan algunos consejos para tratar con copias almacenadas en caché que GitHub aún puede tener.
Duplicado de http://stackoverflow.com/questions/2004024/how-to-permanently-delete-a-file-stored-in-git – Thomas
@Thomas - No es una tontería, esa pregunta es sobre borrar un archivo. Solo quiero borrar una línea en un archivo. – Skilldrick
Bien, esta pregunta no es un dup. La otra pregunta es sobre eliminar un archivo completo, donde la respuesta es usar 'git filter-branch --index-filter'. En el caso de querer eliminar o modificar una línea en un archivo, necesita 'git filter-branch --tree-filter'. –