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?

¿Fue útil?

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:

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:

  1. cd a la rama de base del proyecto
  2. Eliminar el código / archivo sensible
  3. rm -rf .git / # Retire toda la información de Git su código
  4. Ir a github y eliminar su repositorio
  5. 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í

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

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.

  1. 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

  2. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top