Git: Comment faire pour supprimer le fichier à partir de l'index sans la suppression de fichiers à partir de n'importe quel référentiel
Lorsque vous utilisez
git rm --cached myfile
il n'est pas de supprimer le système de fichiers local, qui est le but. Mais si vous avez déjà versionnés et engage le fichier, poussé à un référentiel central, et le tira dans un autre référentiel avant d'utiliser la commande, il va supprimer le fichier à partir de ce système.
Est-il un moyen de supprimer le fichier de gestion des versions sans le supprimer de tout système de fichiers?
Edit: Précision, je l'espère.
- Vous pourriez peut-être développer votre cas d'utilisation. L'indice est la zone de transit pour le prochain commit alors, pourquoi voulez-vous supprimer le fichier à partir de l'index si vous ne voulez pas supprimer de la branche courante?
- Je suis désolé. J'ai voulu dire, myfile a pour une raison quelconque été engagés et distribué il y a longtemps. L'objectif est maintenant de le supprimer de gestion des versions sans le supprimer de personnes. La raison à cela est venu est parce que j'ai accidentellement de version d'un fichier de configuration. Le fichier de configuration est nécessaire, de sorte que je ne veux pas le supprimer de systèmes étrangers.
- J'ai édité la question afin d'être plus clair.
- git rm --mis en cache ne sera pas supprimer le fichier à partir de l'autre répertoire de travail. Le fichier ne sera supprimé que si quelqu'un qui travaille dans ce répertoire exécute un pull. Le fichier peut être facilement récupéré avec "git checkout TÊTE de@{1} foo" (si elle est exécutée immédiatement après le tirage.)
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas qu'un Git commit pouvez enregistrer une intention comme “arrêter le suivi de ce dossier, mais ne pas le supprimer”.
La promulgation d'une telle intention, il faudra l'intervention à l'extérieur de Git dans tous les référentiels de fusion (ou de rebase sur un commit qui supprime le fichier.
Enregistrer une Copie, Appliquez Suppression, Restauration
Probablement la meilleure chose à faire est de dire à vos utilisateurs en aval pour enregistrer une copie du fichier, tirez votre suppression, puis restaurer le fichier.
Si ils tirent via rebase et sont de ‘charge’ des modifications au fichier, ils obtiendront des conflits. Pour résoudre de tels conflits, l'utilisation
git rm foo.conf && git rebase --continue
(si le conflit s'engager a des changements, en dehors de celles pour le fichier supprimé) ougit rebase --skip
(si le conflit s'engager a seulement changé pour le fichier supprimé).De restauration de Fichiers comme sans traces Après le tirage d'un Commit Qui Supprime
Si ils ont déjà tiré la suppression de commettre, ils peuvent toujours récupérer la version précédente du fichier avec git show:
Ou avec git checkout (par commentaire par William Pursell; mais souvenez-vous de la supprimer de l'index!):
Si ils ont pris d'autres mesures depuis tirer votre suppression (ou ils tirent avec rebase dans un décollement de la TÊTE), ils peuvent avoir besoin d'autre chose que de
@{1}
. Ils pourraient utilisergit log -g
pour trouver le commettre juste avant ils ont tiré la suppression.Dans un commentaire, vous mentionnez que le fichier que vous voulez “annuler le suivi, mais garder” est une sorte de fichier de configuration qui est nécessaire pour l'exécution du logiciel (directement d'un référentiel).
Conserver le Fichier en tant que "par Défaut" et Manuellement/Automatiquement Activer
Si elle n'est pas tout à fait inacceptable de continuer à maintenir le fichier de configuration est contenu dans le référentiel, vous pourriez être en mesure de renommer le fichier suivi de (par exemple)
foo.conf
àfoo.conf.default
, puis de demander à vos utilisateurs decp foo.conf.default foo.conf
après l'application de la renommer commettre.Ou, si les utilisateurs utilisent déjà certaines parties du référentiel (par exemple, un script ou un autre programme configuré par le contenu dans le référentiel (par exemple,
Makefile
ou similaire)) pour le lancement et le déploiement de vos logiciels, vous pouvez incorporer un mécanisme défaillant dans l'exécution du processus de déploiement:Avec un tel défaut de mécanisme en place, les utilisateurs devraient être en mesure de tirer un commit qui renomme
foo.conf
àfoo.conf.default
sans avoir à faire aucun travail supplémentaire.Aussi, vous éviter d'avoir à copier manuellement un fichier de configuration si vous faire d'installations supplémentaires ou des répertoires dans l'avenir.
Réécriture De L'Histoire Nécessite Une Intervention Manuelle De Toute Façon...
Si il est inacceptable de maintenir le contenu du référentiel, alors vous voudrez probablement de se débarrasser complètement de l'histoire avec quelque chose comme
git filter-branch --index-filtre ...
.Cela revient à réécrire l'histoire, qui nécessitent une intervention manuelle pour chaque direction/référentiel (voir “Récupération De l'Amont Rebase” dans la section de git rebase page de manuel).
Le traitement spécial requis pour votre fichier de configuration serait juste une autre étape que l'on doit effectuer lors de la récupération de la réécriture:
L'ignorer, pour Prévenir la Récidive
Quelle que soit la méthode que vous utilisez, vous voudrez probablement inclure le nom du fichier de configuration dans un
.gitignore
fichier dans le référentiel afin que nul ne peut, par inadvertance,git add foo.conf
encore (c'est possible, mais nécessite-f
/--force
).Si vous avez plus d'un fichier de configuration, vous pourriez envisager de "mouvement" dans un seul et unique répertoire et ignorant de la chose entière (par "mouvement", je veux dire changer l'emplacement où le programme s'attend à trouver ses fichiers de configuration, et d'obtenir les utilisateurs (ou le lancement de déployer mécanisme) pour copier/déplacer les fichiers vers leur emplacement; manifestement, vous ne voulez pas git mv un fichier dans un répertoire que vous serez en ignorant).
--{,no- }assume-unchanged
est purement locale: son état n'est pas directement enregistrés dans les commet. Il peut aider à prévenir un référentiel de commettre de nouvelles modifications dans le fichier, mais il ne le supprime pas de contrôle de version. Si vous pouvez le régler pour tous vos pertinentes, liées, non-nue dépôts, alors il peut aider votre situation, mais il n'est pas quelque chose que vous pouvez directement appuyez sur+pull/rebase d'autres, non-nue dépôts (en particulier ceux que vous ne contrôlez pas, comme pour l'original sens de la clarification des observations sur la question: voir “des personnes”/“systèmes étrangers”).I do not think a Git commit can record an intention like “stop tracking this file, but do not delete it”.
- maintenant, il peut, avecgit rm --cached foo.conf
Eu le même problème cette semaine quand j'ai accidentellement commis, puis a essayé de supprimer un fichier de compilation à partir d'un référentiel partagé, et ce:
http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html
a bien fonctionné pour moi et pas mentionnée.
Pour supprimer le fichier qui vous intéresse, de contrôle de version, puis utiliser tous vos autres commandes comme d'habitude.
Si vous avez jamais voulu remettre en.
Edit: voir le commentaire de Chris Brown et de KPM, cela ne fonctionne qu'en local et le fichier reste sous contrôle de version pour les autres utilisateurs s'ils ne sont pas aussi le faire. La accepté de répondre donne plus de compléter/corriger des méthodes pour traiter cette question. En outre, quelques notes à partir du lien si vous utilisez cette méthode:
Pour supprimer le fichier à partir de l'index, utilisez:
Cela ne devrait pas affecter votre copie locale ou de quelqu'un d'autre.
reset
supprime uniquement le fichier à partir de l'indice si le fichier n'est pas dans l'actuel CHEF de valider, sinon ça ne retourne l'index de la version de l'actuel CHEF de version.Après avoir fait de la
git rm --cached
de commande, essayez d'ajoutermyfile
à la.gitignore
fichier (en créer un s'il n'existe pas). Cela devrait indiquer à git d'ignorermyfile
.La
.gitignore
fichier est versionné, de sorte que vous aurez besoin de le commettre et les pousser vers le dépôt distant.git rm --cached remove_file
git add .gitignore
git commit -m "Excluding"
Ma solution est de tirer sur l'autre copie de travail, puis faire:
qui dit obtenir tous les chemins d'accès aux fichiers dans le dernier commentaire, et de les vérifier à partir de la parent de la TÊTE. Le travail est accompli.
Les solutions ci-dessus fonctionnent très bien pour la plupart des cas.
Toutefois, si vous devez également supprimer toutes les traces de ce fichier (c'est à dire des données sensibles comme les mots de passe), vous aurez aussi envie de le supprimer de votre ensemble de commettre l'histoire, que le fichier pourrait encore être récupérées à partir de là.
Voici une solution qui supprime toutes les traces du fichier à partir de votre ensemble de commettre l'histoire, comme si elle n'avait jamais existé, mais conserve le fichier sur votre système.
https://help.github.com/articles/remove-sensitive-data/
Vous pouvez réellement passer à l'étape 3 si vous êtes dans votre dépôt git local, et n'ont pas besoin d'effectuer un essai. Dans mon cas, je n'avais besoin que les étapes 3 et 6, comme je l'avais déjà créé ma .gitignore fichier, et a été dans le référentiel, et je voulais travailler sur.
Pour voir vos modifications, vous devez aller à la GitHub racine de votre dépôt et actualisez la page. Puis naviguer à travers les liens pour obtenir d'un ancien commit que, une fois le fichier, pour voir qu'il a été supprimé. Pour moi, tout simplement rafraîchissant l'ancien commit page n'a pas montrer le changement.
Il semblait intimidant au début, mais vraiment, c'est facile et a travaillé comme un charme ! 🙂