Eliminar archivos sensibles y sus confirmaciones de Git historia
-
22-08-2019 - |
Pregunta
Me gustaría poner un proyecto Git en GitHub pero contiene algunos archivos con datos sensibles (nombres de usuario y contraseñas, como /config/deploy.rb para capistrano).
Sé que puedo agregar que estos nombres de archivo para .gitignore, pero esto no quita su historia dentro de Git.
Yo también no quiero empezar de nuevo mediante la eliminación de la /.directorio de git.
Hay una manera de quitar todos las huellas de un archivo en particular en el Git de la historia?
Solución
Para todos los propósitos prácticos, la primero cosa que usted debe estar preocupado es CAMBIAR SUS CONTRASEÑAS! No es claro a partir de tu pregunta si tu repositorio git es enteramente local o si usted tiene un repositorio remoto en otros lugares todavía;si es remoto y no asegurados a otros que usted tiene un problema.Si alguien ha clonado el repositorio antes de solucionar este problema, se tendrá una copia de su contraseña en su máquina local, y no hay manera de que usted puede forzar la actualización de su "fija" la versión que se ha ido de la historia.La única cosa segura que se puede hacer es cambiar su contraseña a otra cosa en todas partes los han usado.
Con eso fuera del camino, he aquí cómo solucionarlo. GitHub respondió exactamente a esta pregunta como un documento de preguntas frecuentes:
Nota para usuarios de Windows:el uso de comillas dobles (") en lugar de singles en este comando
git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
Tenga en cuenta que una vez que se han llevado este código a un repositorio remoto como GitHub y otros han clonado que repositorio remoto, ahora estás en una situación en la que estamos reescribiendo la historia.Cuando otros tratan de tirar abajo los últimos cambios después de esto, se obtendrá un mensaje que indica que los cambios no se pueden aplicar porque no es un fast-forward.
Para solucionar esto, se tendrá que eliminar de su repositorio existente y volver a clonar, o siga las instrucciones de la sección "RECUPERACIÓN DE aguas ARRIBA de REAJUSTE" en la git-reajuste manual.
En el futuro, si usted accidentalmente cometer algunos cambios con información sensible, pero te aviso antes de empujando a un repositorio remoto, hay algunas más fáciles de errores.Si la última cometer es el de agregar la información confidencial, usted puede simplemente eliminar la información sensible, a continuación, ejecute:
git commit -a --amend
Que modificará la anterior comprometerse con los nuevos cambios que ha realizado, incluyendo todo el archivo retiros hecho con un git rm
.Si los cambios son más atrás en la historia, pero aún no se insertan en un repositorio remoto, usted puede hacer un interactivo de reajuste:
git rebase -i origin/master
Que se abre un editor con el cometa que he hecho desde su último ancestro común con el repositorio remoto.El cambio de "recoger" a "editar" sobre cualquiera de las líneas que representan una confirmación con la información sensible, y guardar y salir.Git tendrá que caminar a través de los cambios, y los dejo en un lugar donde usted puede:
$EDITOR file-to-fix
git commit -a --amend
git rebase --continue
Para cada cambio con información sensible.Finalmente, usted va a terminar de nuevo en su rama, y puede empujar a los nuevos cambios.
Otros consejos
Cambiar las contraseñas es una buena idea, pero para el proceso de eliminación de la contraseña de su repo de la historia, recomiendo el BFG Repo-Limpiador, un más rápido, más simple alternativa a git-filter-branch
expresamente diseñado para la eliminación de los datos privados de repositorios Git.
Crear un private.txt
archivo de listado de las contraseñas, etc, de la que desea eliminar (una entrada por línea) y, a continuación, ejecute este comando:
$ java -jar bfg.jar --replace-text private.txt my-repo.git
Todos los archivos bajo un umbral de tamaño (1 MB por defecto) en su repo de la historia serán analizados, y cualquier coincidencia (que no está en su última commit) será reemplazado con la cadena "***ELIMINADO***".Usted puede utilizar git gc
para limpiar y quitar el muerto de datos:
$ git gc --prune=now --aggressive
La BFG es de entre 10 a 50 veces más rápido que corriendo git-filter-branch
y las opciones son simplificados y adaptados alrededor de estos dos casos de uso:
- La eliminación de Loco De Archivos De Gran Tamaño
- La eliminación de Contraseñas, Credenciales y otros Los datos privados
La divulgación completa:Soy el autor de la BFG Repo-Limpiador.
este script por David Underhill, trabajado como un encanto para mí.
Se añade estos comandos en filter-branch Además de natacado a limpiar el desorden que deja tras de sí:
rm -rf .git/refs/original/
git reflog expire --all
git gc --aggressive --prune
guión completo (todo el crédito a David Underhill)
#!/bin/bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2
if [ $# -eq 0 ]; then
exit 0
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter \
"git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch
# otherwise leaves behind for a long time
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune
Los dos últimos comandos pueden funcionar mejor si se ha cambiado a lo siguiente:
git reflog expire --expire=now --all && \
git gc --aggressive --prune=now
Si empujado a GitHub, fuerza de empuje no es suficiente, eliminar el apoyo repositorio o contactos
Incluso si se fuerza Empuje un segundo después, no es suficiente, como se explica a continuación.
Los cursos válidas sólo de acción son:
-
es lo filtró una credencial cambiante como una contraseña?
- Sí: modificar sus contraseñas de inmediato, y considerar el uso de más teclas de OAuth y API
-
No (desnudos fotos):
-
qué te importa si todos los problemas en el repositorio conseguir bombardeado?
- No: eliminar el repositorio
-
Sí:
- Soporte de contactos
- si la fuga es muy importante para usted, hasta el punto que usted está dispuesto a conseguir un poco de tiempo de inactividad repositorio para que sea menos probable escaparse, hacen privada mientras espera el apoyo de GitHub para responder a usted
-
Fuerza empujando un segundo más tarde no es suficiente, ya que:
-
GitHub mantiene colgando compromete durante mucho tiempo.
Personal de GitHub tiene el poder de eliminar tales colgando compromete si se comunica con ellos sin embargo.
He experimentado esto de primera mano cuando subido todos los correos con GitHub a un acuerdo de recompra me pidieron que la bajara, así que lo hice, e hicieron un
gc
. Tire de las peticiones que contienen los datos tienen que se eliminan sin embargo : que los datos de pase se mantuvieron accesibles hasta un año después del derribo inicial debido a esto.compromete colgantes se pueden ver bien a través de:
- de la interfaz web comprometerse: https://github.com/cirosantilli/test- colgando / commit / 53df36c09f092bbb59f2faa34eba15cd89ef8e83 ( Wayback máquina )
- la API: https://api.github.com/ repos / cirosantilli / test-colgando / comete / 53df36c09f092bbb59f2faa34eba15cd89ef8e83 ( Wayback máquina )
Una forma conveniente de obtener la fuente en que se comprometen a continuación, es utilizar el método de descarga zip, que puede aceptar cualquier referencia, por ejemplo: https://github.com/cirosantilli/myrepo/archive/SHA.zip
-
Es posible acceder a la falta SHA ya sea por:
- lista de sucesos de API con
type": "PushEvent"
. P.ej. mina: https://api.github.com/users/cirosantilli/events/public ( Wayback ) - más convenientemente a veces, mirando a los agentes de mantenimiento de las solicitudes de extracción que trataron de eliminar el contenido
- lista de sucesos de API con
-
Hay raspadores como http://ghtorrent.org/ y https://www.githubarchive.org/ que reúnen periódicamente los datos de GitHub y almacenarlaen otra parte.
No he podido encontrar si se rascan el actual cometer diff, y que es poco probable ya que no habría demasiados datos, pero es técnicamente posible, y la NSA y amigos probable es que tenga filtros para archivar único material relacionado con personas o se compromete de interés.
Si elimina el repositorio en lugar de sólo la fuerza de empuje sin embargo, se compromete hacer desaparecer incluso de la API de inmediato y darle 404, por ejemplo, https://api.github.com/repos/cirosantilli/ prueba-cuelga-delete / cometa / 8c08448b5fbf0f891696819f3b2b2d653f7a3824 Esto funciona incluso si se vuelve a crear otro repositorio con el mismo nombre.
Para probar esto, he creado un acuerdo de recompra: https://github.com/cirosantilli/ prueba colgando y lo hizo:
git init
git remote add origin git@github.com:cirosantilli/test-dangling.git
touch a
git add .
git commit -m 0
git push
touch b
git add .
git commit -m 1
git push
touch c
git rm b
git add .
git commit --amend --no-edit
git push -f
Vea también: Cómo quitar un colgante cometer desde GitHub?
Para que quede claro: La respuesta aceptada es correcta. Pruebe primero. Sin embargo, puede ser innecesariamente compleja para algunos casos de uso, sobre todo si se producen errores desagradables tales como 'fatal: la mala revisión --prune-vacío'., O realmente no se preocupan por la historia de tu repositorio
Una alternativa sería:
- cd a la rama de base del proyecto
- Eliminar el código / archivo sensible
- rm -rf .git / # Retire toda la información de Git su código
- Ir a github y eliminar su repositorio
- Siga esta guía para empujar su código a un nuevo repositorio como lo haría normalmente - https://help.github.com/articles / adición-un-existente-proyecto-a-github-usando-la-línea de comandos /
Esto, por supuesto eliminar todas las ramas cometer historia, y las cuestiones tanto de tu repositorio GitHub, y su repositorio git local. Si esto es inaceptable que se tiene que utilizar un enfoque alternativo.
Llame a este la opción nuclear.
Aquí está mi solución en las ventanas
git filter-branch --tree-filtro "rm -f 'filedir / nombre de archivo'" HEAD
git push --force
asegurarse de que la ruta es correcta de lo contrario, no funcionará
espero que ayude
Use filtro de rama :
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *file_path_relative_to_git_repo*' --prune-empty --tag-name-filter cat -- --all
git push origin *branch_name* -f
Puede utilizar git forget-blob
.
El uso es bastante simple git forget-blob file-to-forget
. Puede obtener más información aquí
desaparecerá de todas las confirmaciones en el historial, reflog, etiquetas, etc.
Me topado con el mismo problema de vez en cuando, y cada vez que tenga que volver a este post y otros, por eso me automatizado el proceso.
Los créditos a contribuyentes de desbordamiento de pila que me permitieron poner esto juntos
he tenido que hacer esto un par de veces al día. Tenga en cuenta que esto sólo funciona en 1 archivo a la vez.
-
Obtener una lista de todos los envíos que se modifica un archivo. El uno en la parte inferior será el de la primera cometer:
git log --pretty=oneline --branches -- pathToFile
-
Para eliminar el archivo de historial de uso de la primera cometen sha1 y la ruta al archivo de la orden anterior, y llenarlos en este comando:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <path-to-file>' -- <sha1-where-the-file-was-first-added>..
Por lo tanto, se ve algo como esto:
git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore
Eliminar caché para el archivo de seguimiento de Git y añadir ese archivo a la lista de
.gitignore
En mi proyecto androide que tenía admob_keys.xml como archivo XML separado en app / src / main / res / valores carpeta /. Para eliminar este archivo sensible utilicé más adelante guión y funcionó perfectamente.
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch app/src/main/res/values/admob_keys.xml' \
--prune-empty --tag-name-filter cat -- --all