Comment supprimer une révision spécifique d'un github gist?

j'ai créé un Gist sur GitHub et j'ai vu des informations que je ne veux pas que quiconque voit. J'ai mis à jour le fichier depuis, mais tout le monde peut encore accéder à l'ancienne version du fichier.

mis à part la suppression de L'essentiel, y a-t-il un moyen de supprimer définitivement cette révision particulière?

j'ai vu que je ne suis pas le seul à avoir ce genre de problème ( Git: supprimer une seule révision à distance ) mais je n'ai pas réussi à supprimer la révision. Le processus indiqué ici semble pour aider à supprimer certains fichiers. Je veux supprimer toute la révision.

27
demandé sur Community 2011-05-06 17:40:35

5 réponses

Github a une page d'aide sur la suppression des données sensibles:

http://help.github.com/removing-sensitive-data/

comme les gists ne sont que des dépôts git, vous devriez être en mesure de cloner localement votre gist, faire le nettoyage et faire un effort forcé pour écraser la version github avec le repo nettoyé.

Oui, après réflexion: Si <commit> est le commit que vous voulez "supprimer", ne

 git rebase -i <commit>^

marquer la ligne pour <commit> comme edit , enregistrer et quitter.

git va configurer le répertoire de travail de l'état après que vous avez comitté <commit> . Fixez le fichier, utilisez git add et git commit --amend pour fixer la propagation. Alors faites git rebase --continue . Si la seule chose, la prochaine propagation a fait, était de supprimer les données sensibles, elle sera probablement automatiquement supprimée car elle ne contient pas de modifications après la propagation modifiée.

ensuite, faire un git push -f pour forcer la mise à jour (parce qu'il est maintenant non-fast-forward, ce qui signifie qu'il modifie déjà l'historique git publié).

30
répondu Tilman Vogel 2017-11-27 14:16:36

la réponse acceptée est bonne mais un peu difficile à suivre. Voici la même réponse, mais un peu plus doux.

comme le dit Tilman Vogel, les GIST ne sont que des dépôts et cette approche fonctionne aussi bien pour les dépôts github que pour les GIST.

supposons qu'il n'y a qu'une seule version qui contient un mot de passe que vous ne voulez pas montrer. Vous avez vérifié la nouvelle version avec le mot de passe enlevé et vous voulez vous débarrasser de la version précédente. Vous devrait être capable d'adapter ce processus s'il y a un certain nombre de propagations montrant le mot de passe.

La première chose, c'est que la réparation doit être faite sur votre machine locale (pas sur github). Pour ce faire, il faut d'abord cloner l'essentiel localement. La page de GitHub sur GitHub devrait vous montrer comment créer un clone privé si vous cliquez sur l'URL du clone privé. Quelque chose comme:

git clone git@gist.github.com:421xxx1.git gist-421xxx1

cela vous donne une copie locale que vous devez rebaser (ce qui signifie muck around avec les versions).

cd gist-421xxx1
git rebase -i eexxaa^

où eeccaa est la (première) version contenant le mot de passe. Vous pouvez obtenir ce numéro dans la colonne des révisions de la page gist. Le ^ est nécessaire. La commande signifie " Laissez-moi changer les vérisons de eexxaa à la dernière, interactivement. La commande ouvre un éditeur peuplée avec une commande sur chaque ligne pour chaque version dans le repo. La commande par défaut est 'prendre', qui signifie 'utiliser ou de conserver cette version".

le les premières lignes de l'éditeur doivent ressembler à quelque chose comme

pick eexxaa    <- the version with the password
pick ffxxbb    <- the first version without the password

Modifier pour

pick eexxaa    
squash ffxxbb 

i. e. Changez le mot 'pick' en 'squash' sur la version sans mot de passe. Cela demandera au rebase d'écraser la nouvelle version (sans mot de passe) dans l'ancienne (port de mot de passe), supprimant essentiellement la version eexxaa. Évidemment vos versions seront autres que eexxaa ou ffxxbb n'utilisez littéralement eexxaa ou ffxxbb nulle part!

comme @kand note, vous devez squash chaque version qui contenait le mot de passe.

dans l'éditeur enregistrer et quitter (si c'est vi :x). Le rebase devrait maintenant ouvrir un nouvel éditeur montrant les messages de propagation pour les deux versions et demandant un seul message de propagation combiné. Pour un gist ces messages sont tout à fait susceptibles d'être vides, mais vous devez mettre quelque chose ici ou le rebase va avorter. Tapez un message, Enregistrez-le et quittez et le rebase devrait être complet.

vous avez maintenant un dépôt sans la version contenant le mot de passe. Pour obtenir ce retour à l'essentiel:

git push -f

cela va forcer les changements sur le GitHub repo. Appuyez sur rafraîchir et vous devriez être en mesure de vérifier dans le navigateur que la version incriminée a disparu de la colonne des révisions sur le côté droit.

That's it!

22
répondu meesern 2014-07-13 02:37:16

si vous voulez supprimer complètement quelque chose du dépôt, vous devez utiliser git filter-branch.

http://git-scm.com/docs/git-filter-branch

2
répondu ralphtheninja 2011-05-06 13:54:56

si vous ne vous souciez pas de montrer l'une des révisions sur le gist, vous pouvez faire ce qui suit pour éliminer toute l'histoire et juste montrer une révision.

git clone some-gist-repo
cd some-gist-repo
git rebase -i --root $tip

vous seriez en mesure de voir tous les commits pour ce gist dans votre éditeur. Il suffit de choisir le premier et de remplacer tout le reste par s ou squash . Une fois fait, Enregistrez et ajoutez un message de propagation et puis faites une poussée de force au maître comme ceci et vous êtes bon.

git push -f origin master

La seule révision qui serait visible est l'ajout de fichier(s) et c'est tout.

2
répondu Rafay 2017-03-10 07:40:55

ajoute à la réponse de meesern. Lorsque vous essayez d'écraser ou de corriger et rebase--continue, vous devez ajouter un commentaire ou --allow-empty-message . Cela prend beaucoup de temps, et d'une certaine manière, mes propagations ne se sont pas éloignées de la liste des révisions de gist en faisant cela.

j'ai trouvé une solution plus simple: Vous pouvez simplement supprimer les lignes de commit inutiles sur votre liste de tâches de rebase, :wq! , git rebase --continue , et git push -f .

0
répondu ShunS 2016-06-21 12:16:11