Je voudrais mettre un projet Git sur GitHub mais il contient certains fichiers avec des données sensibles (noms d'utilisateur et mots de passe, comme /config/deploy.rb pour capistrano).
Je sais que je peux ajouter ces noms de fichiers à .gitignore , mais cela ne supprimera pas leur historique dans Git.
Je ne veux pas non plus recommencer en supprimant le répertoire /.git.
Existe-t-il un moyen de supprimer toutes les traces d'un fichier particulier dans votre historique Git?
Réponses:
À toutes fins pratiques, la première chose qui devrait vous inquiéter est de CHANGER VOS MOTS DE PASSE! Il ne ressort pas clairement de votre question si votre référentiel git est entièrement local ou si vous avez un référentiel distant ailleurs encore; s'il est éloigné et n'est pas protégé des autres, vous avez un problème. Si quelqu'un a cloné ce référentiel avant de résoudre ce problème, il aura une copie de vos mots de passe sur sa machine locale, et il n'y a aucun moyen de les forcer à mettre à jour vers votre version "fixe" avec elle est passée de l'histoire. La seule chose sûre que vous pouvez faire est de changer votre mot de passe en quelque chose d'autre partout où vous l'avez utilisé.
Avec cela à l'écart, voici comment y remédier. GitHub a répondu exactement à cette question en tant que FAQ :
Remarque pour les utilisateurs de Windows : utilisez des guillemets doubles (") au lieu de simples dans cette commande
Mise à jour 2019:
Voici le code actuel de la FAQ:
Gardez à l'esprit qu'une fois que vous avez poussé ce code vers un référentiel distant comme GitHub et que d'autres ont cloné ce référentiel distant, vous êtes maintenant dans une situation où vous réécrivez l'historique. Lorsque d'autres essaient de dérouler vos dernières modifications après cela, ils recevront un message indiquant que les modifications ne peuvent pas être appliquées car ce n'est pas une avance rapide.
Pour résoudre ce problème, ils devront soit supprimer leur référentiel existant et le recloner, soit suivre les instructions sous "RECOVERING FROM UPSTREAM REBASE" dans la page de manuel git-rebase .
Astuce : exécuter
git rebase --interactive
À l'avenir, si vous effectuez accidentellement des modifications avec des informations sensibles mais que vous le remarquez avant de passer à un référentiel distant, il existe des correctifs plus faciles. Si votre dernier commit est celui pour ajouter les informations sensibles, vous pouvez simplement supprimer les informations sensibles, puis exécuter:
Cela modifiera la validation précédente avec toutes les nouvelles modifications que vous avez apportées, y compris les suppressions de fichiers entières effectuées avec a
git rm
. Si les modifications remontent plus loin dans l'historique mais ne sont toujours pas transmises à un référentiel distant, vous pouvez effectuer un rebasage interactif:Cela ouvre un éditeur avec les validations que vous avez faites depuis votre dernier ancêtre commun avec le référentiel distant. Remplacez «choisir» par «modifier» sur toutes les lignes représentant un commit contenant des informations sensibles, puis enregistrez et quittez. Git vous guidera à travers les changements et vous laissera à un endroit où vous pourrez:
Pour chaque changement avec des informations sensibles. Finalement, vous vous retrouverez dans votre branche et vous pourrez pousser les nouvelles modifications en toute sécurité.
la source
filter-branch
code et celui de la page github à laquelle vous avez lié. Par exemple, leur 3e ligne--prune-empty --tag-name-filter cat -- --all
. La solution a-t-elle changé ou manque-t-il quelque chose?<introduction-revision-sha1>..HEAD
ne fonctionne pas. Il supprime uniquement le fichier à partir du deuxième commit. (Comment puis-je inclure la validation initiale dans la plage de validations?) La méthode d'enregistrement est indiquée ici: help.github.com/articles/…git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' \ --prune-empty --tag-name-filter cat -- --all
Changer vos mots de passe est une bonne idée, mais pour le processus de suppression des mots de passe de l'historique de votre référentiel, je recommande le BFG Repo-Cleaner , une alternative plus rapide et plus simple à celle
git-filter-branch
explicitement conçue pour supprimer les données privées des référentiels Git.Créez un
private.txt
fichier répertoriant les mots de passe, etc., que vous souhaitez supprimer (une entrée par ligne), puis exécutez cette commande:Tous les fichiers sous une taille de seuil (1 Mo par défaut) dans l'historique de votre dépôt seront analysés et toute chaîne correspondante (qui n'est pas dans votre dernier commit) sera remplacée par la chaîne "*** SUPPRIMÉ ***". Vous pouvez ensuite utiliser
git gc
pour nettoyer les données mortes:Le BFG est généralement 10 à 50 fois plus rapide que l'exécution
git-filter-branch
et les options sont simplifiées et adaptées à ces deux cas d'utilisation courants:Divulgation complète: je suis l'auteur du BFG Repo-Cleaner.
la source
git commit
. Sinon, +1 pour le nouvel outil dans la boîte à outils du développeur :)These are your protected commits, and so their contents will NOT be altered
tout en parcourant et en révisant le reste de votre historique de commit. Si vous aviez besoin de revenir en arrière, alors oui, il vous suffirait de faire une recherche***REMOVED***
dans le commit auquel vous venez de revenir.Si vous avez poussé vers GitHub, la poussée forcée ne suffit pas, supprimez le référentiel ou contactez le support
Même si vous forcez à pousser une seconde après, ce n'est pas suffisant comme expliqué ci-dessous.
Les seuls plans d'action valides sont:
est ce qui a divulgué une information d'identification modifiable comme un mot de passe?
non (photos nues):
vous souciez-vous si tous les problèmes du référentiel sont supprimés?
Oui:
Forcer à pousser une seconde plus tard ne suffit pas car:
GitHub maintient les validations pendant longtemps.
Le personnel de GitHub a le pouvoir de supprimer ces commissions pendantes si vous les contactez cependant.
J'ai vécu cette expérience de première main lorsque j'ai téléchargé tous les e-mails de validation de GitHub dans un référentiel, ils m'ont demandé de le retirer, alors je l'ai fait, et ils l'ont fait
gc
. Les demandes d'extraction qui contiennent les données doivent cependant être supprimées : les données de mise en pension sont restées accessibles jusqu'à un an après le retrait initial pour cette raison.Les commissions pendantes peuvent être vues à travers:
Une façon pratique d'obtenir la source à ce commit est alors d'utiliser la méthode de téléchargement zip, qui peut accepter n'importe quelle référence, par exemple: https://github.com/cirosantilli/myrepo/archive/SHA.zip
Il est possible de récupérer les SHA manquants soit par:
type": "PushEvent"
. Par exemple le mien: https://api.github.com/users/cirosantilli/events/public ( Wayback machine )Il existe des scrappers comme http://ghtorrent.org/ et https://www.githubarchive.org/ qui regroupent régulièrement les données GitHub et les stockent ailleurs.
Je ne pouvais pas trouver s'ils supprimaient le différentiel de validation réel, ce qui est peu probable car il y aurait trop de données, mais c'est techniquement possible, et la NSA et ses amis ont probablement des filtres pour archiver uniquement les éléments liés aux personnes ou aux commits d'intérêt.
Si vous supprimez le référentiel au lieu de simplement forcer, cependant, les validations disparaissent immédiatement de l'API et donnent 404, par exemple https://api.github.com/repos/cirosantilli/test-dangling-delete/commits/8c08448b5fbf0f891696819f3b2b2d653f7a3824 Cela fonctionne même si vous recréez un autre référentiel du même nom.
Pour tester cela, j'ai créé un dépôt: https://github.com/cirosantilli/test-dangling et j'ai fait:
Voir aussi: Comment supprimer un commit pendant de GitHub?
la source
Je recommande ce script de David Underhill, qui a fonctionné comme un charme pour moi.
Il ajoute ces commandes en plus de la branche filtre de natacado pour nettoyer le désordre qu'il laisse derrière lui:
Script complet (tout le crédit à David Underhill)
Les deux dernières commandes peuvent mieux fonctionner si elles sont modifiées comme suit:
la source
git gc --aggressive --prune=now
Pour être clair: la réponse acceptée est correcte. Essayez-le d'abord. Cependant, cela peut être inutilement complexe pour certains cas d'utilisation, en particulier si vous rencontrez des erreurs odieuses telles que 'fatal: bad revision --prune-empty', ou si vous ne vous souciez pas vraiment de l'historique de votre dépôt.
Une alternative serait:
Cela supprimera bien sûr toutes les branches d'historique de validation et les problèmes de votre dépôt github et de votre dépôt git local. Si cela est inacceptable, vous devrez utiliser une autre approche.
Appelez cela l'option nucléaire.
la source
Vous pouvez utiliser
git forget-blob
.L'utilisation est assez simple
git forget-blob file-to-forget
. Vous pouvez obtenir plus d'informations icihttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Il disparaîtra de toutes les validations de votre historique, reflog, tags, etc.
Je rencontre de temps en temps le même problème, et chaque fois que je dois revenir à ce poste et à d'autres, c'est pourquoi j'ai automatisé le processus.
Crédits aux contributeurs de Stack Overflow qui m'ont permis de mettre cela ensemble
la source
Voici ma solution sous windows
assurez-vous que le chemin est correct sinon il ne fonctionnera pas
J'espère que ça aide
la source
Utiliser une branche de filtre :
la source
J'ai dû le faire plusieurs fois à ce jour. Notez que cela ne fonctionne que sur 1 fichier à la fois.
Obtenez une liste de toutes les validations qui ont modifié un fichier. Celui en bas sera le premier commit:
git log --pretty=oneline --branches -- pathToFile
Pour supprimer le fichier de l'historique, utilisez le premier commit sha1 et le chemin d'accès au fichier de la commande précédente, et remplissez-les dans cette commande:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <path-to-file>' -- <sha1-where-the-file-was-first-added>..
la source
Donc, cela ressemble à ceci:
la source
Dans mon projet Android, j'avais admob_keys.xml en tant que fichier xml séparé dans le dossier app / src / main / res / values / . Pour supprimer ce fichier sensible, j'ai utilisé le script ci-dessous et j'ai parfaitement fonctionné.
la source