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, utilisez git rm foo.conf && git rebase --continue
(si le conflit s'engager a des changements, en dehors de celles pour le fichier supprimé) ou git rebase --skip
(si le conflit s'engager a seulement changé pour le fichier supprimé).
Restauration de Fichiers comme sans traces Après le tirage d'un Commit Qui le 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:
git show @{1}:foo.conf >foo.conf
Ou avec git checkout (par commentaire par William Pursell; mais souvenez-vous de la supprimer de l'index!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
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 d' @{1}
. Ils pourraient utiliser git log -g
trouver le commettre, juste avant qu'ils tiré votre 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 l'Activer
Si ce 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 (par exemple,) foo.conf
de foo.conf.default
, puis de demander à vos utilisateurs de cp 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:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Avec un tel défaut de mécanisme en place, les utilisateurs devraient être en mesure de tirer un commit qui renomme foo.conf
de 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-filter …
.
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:
- Enregistrer une copie du fichier de configuration.
- Récupérer à partir de la réécriture.
- Restaurer le fichier de configuration.
L'ignorer pour Éviter les Récidives
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 requiert -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 d'un fichier dans un répertoire que vous allez ignorer).
0 votes
Peut-être pourriez-vous préciser votre cas d'utilisation. L'index est la zone d'attente pour le prochain commit, alors pourquoi voulez-vous supprimer le fichier de l'index si vous ne voulez pas le supprimer de la branche actuelle ?
1 votes
Je suis désolée. Je voulais dire que mon fichier a, pour une raison ou une autre, été commité et distribué il y a longtemps. L'objectif est maintenant de le retirer du versioning sans l'effacer des systèmes des gens. La raison pour laquelle ce problème est apparu est que j'ai accidentellement versionné un fichier de configuration. Le fichier de configuration est nécessaire, donc je ne veux pas le supprimer des systèmes étrangers.
0 votes
J'ai modifié la question pour qu'elle soit plus claire.
3 votes
Git rm --cached ne supprimera pas le fichier de l'autre répertoire de travail. Le fichier ne sera supprimé que si quelqu'un travaillant dans ce répertoire exécute un pull. Le fichier peut facilement être récupéré avec "git checkout HEAD@{1} foo" (s'il est exécuté immédiatement après le pull).