427 votes

Supprimer les fichiers sensibles et leur validation de Git histoire

Je voudrais poser un projet Git sur GitHub, mais il contient certains fichiers contenant des données sensibles (noms d’utilisateurs et mots de passe, comme /config/deploy.rb de capistrano).

Je sais que je peux ajouter les noms de ces fichiers à .gitignore, mais cela n’enlèverait pas leur histoire au sein de la Git.

Je ne veux pas recommencer en supprimant le répertoire /.git.

Y a-t-il un moyen pour éliminer toute trace d’un fichier particulier dans votre historique de Git ?

524voto

natacado Points 2612

À toutes fins pratiques, la première chose que vous devriez être inquiet est de CHANGER VOS mots de passe! Il n'est pas clair à partir de votre question, si votre dépôt git est entièrement local ou si vous avez un dépôt distant ailleurs encore; si c'est à distance et non de garanties des autres, vous avez un problème. Si quelqu'un a cloné qui référentiel avant de vous résoudre ce problème, ils vont avoir une copie de votre mot de passe sur leur machine locale, et il n'y a aucun moyen que vous pouvez les forcer à mettre à jour votre "fixe" version avec elle a disparu de l'histoire. La seule chose que vous pouvez faire est de changer votre mot de passe à autre chose partout, vous l'avez déjà utilisé.


Avec cela de la route, voici comment résoudre le problème. GitHub a répondu exactement à la question que comme une FAQ:

git filter-branch --index-filter \
'git update-index --remove filename' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

Gardez à l'esprit qu'une fois que vous avez poussé ce code à un dépôt distant comme GitHub et d'autres ont cloné que le dépôt distant, vous êtes maintenant dans une situation où vous êtes à la réécriture de l'histoire. Quand d'autres, essayez de tirer vers le bas vos dernières modifications après cela, ils recevront un message indiquant que les changements ne peuvent pas être appliquée parce qu'elle n'est pas un fast-forward.

Pour résoudre ce problème, ils doivent supprimer leur référentiel existant et re-cloner, ou suivez les instructions sous "RÉCUPÉRATION DE l'AMONT REBASE" dans le git-git rebase page de manuel.


Dans l'avenir, si vous avez accidentellement commettre certains changements, avec des informations sensibles, mais vous un avis avant de pousser à un dépôt distant, il y a quelques plus facile de bugs. Si vous le dernier commit est le seul à ajouter les informations sensibles, vous pouvez simplement supprimer les informations sensibles, puis exécutez:

git commit -a --amend

Modifier la précédente s'engager avec les nouvelles modifications que vous avez apportées, y compris la totalité du fichier absorptions fait avec un git rm. Si les changements sont plus loin dans l'histoire, mais pas encore poussé à un dépôt distant, vous pouvez faire un rebase interactif:

git rebase -i origin/master

Qui ouvre un éditeur de texte avec les commits que vous avez fait depuis votre dernier ancêtre commun avec le dépôt distant. Changement de "ramasser" pour "modifier" sur toutes les lignes représentant un commit avec des informations sensibles, et d'enregistrer et quitter. Git va à pied à travers les changements, et vous laisser à un endroit où vous pouvez:

$EDITOR file-to-fix
git commit -a --amend
git rebase --continue

Pour chaque modification des informations sensibles. Finalement, vous vous retrouverez sur votre branche, vous pouvez sans risque de pousser les nouveaux changements.

111voto

Roberto Tyley Points 4352

Changer votre mot de passe est une bonne idée, mais pour le processus de suppression du mot de passe de votre pension de l'histoire, je vous recommande le BFG Repo-Nettoyant, une plus rapide, alternative plus simple à git-filter-branch explicitement conçu pour supprimer les données privées de Git repos.

Créer un private.txt le fichier de liste de mots de passe, etc, que vous souhaitez supprimer (une par ligne), puis exécutez cette commande:

$ java -jar bfg.jar  --replace-text private.txt  my-repo.git

Tous les fichiers sous un seuil de taille (1 MO par défaut) dans votre pension de l'histoire seront analysés, et toute chaîne correspondante (qui n'est pas dans votre dernier commit) sera remplacé par la chaîne de caractères "***SUPPRIMÉ***". Vous pouvez ensuite utiliser git gc pour nettoyer la mort des données:

$ git gc --prune=now --aggressive

Le BFG est en général de 10-50x plus rapide que la course git-filter-branch , et les options sont simplifiées et adaptées autour de ces deux cas d'utilisation:

  • Retrait Fou De Gros Fichiers
  • La suppression des mots de passe, Identifiants et autres données Privées

La divulgation complète: je suis l'auteur de la BFG Repo-Cleaner.

19voto

Jason Goemaat Points 7211

Je recommande ce script par David Underhill, a fonctionné comme un charme pour moi.

Il ajoute que ces commandes de plus filtre-branche de natacado pour nettoyer le gâchis, il laisse derrière lui :

Script complet (tout crédit à David Underhill)

2voto

przbadu Points 749

Je pense que vous êtes à la recherche pour cela :

  1. Retirez votre histoire de cache d’utiliser git `` commande. Cette commande va conserver votre fichier dans le répertoire local mais supprimer le fichier de votre repo.

Ainsi, il ressemble à ceci :

Maintenant, ajoutez dans votre fichier. Et votre fichier n’est pas obtenir suivi par git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X