Supprimer un dossier du suivi Git

405

Je dois exclure un dossier (téléchargement de nom) du suivi. J'ai essayé de courir

git rm -r --cached wordpress/wp-content/uploads

et après cela j'ai ajouté le chemin vers .gitignore

/wordpress/wp-content/uploads

mais quand j'ai couru, git statusils apparaissent comme supprimés. Si j'essaie de valider les modifications, les fichiers seront supprimés, non seulement supprimés du suivi.

Qu'est-ce que je fais mal?

J'ai aussi essayé

git update-index --assume-unchanged <file>

mais cela semble ne suivre que les fichiers. Mais je dois supprimer un dossier entier (y compris les sous-dossiers) du suivi.

Stefan Diabo
la source
Supprimé ne signifie pas que git va supprimer vos fichiers. Cependant, si vous utilisez reset --hard, ce sera le cas.
keltar
2
Comme le mentionne @keltar, la validation n'entraînera pas la suppression de vos fichiers. Il validera leur suppression de Git , mais votre copie de travail les contiendra toujours. Mais si vous vous pullengagez ailleurs, ces fichiers seront supprimés du nouveau système.
Chris

Réponses:

870

Je suis tombé sur cette question pendant que Google recherchait "git remove folder from tracking". La question du PO m'a amené à la réponse. Je le résume ici pour les générations futures.

Question

Comment supprimer un dossier de mon référentiel git sans le supprimer de ma machine locale (c'est-à-dire l'environnement de développement)?

Réponse

Étape 1. Ajoutez le chemin du dossier au .gitignorefichier racine de votre référentiel .

path_to_your_folder/

Étape 2. Supprimez le dossier de votre suivi git local, mais conservez-le sur votre disque.

git rm -r --cached path_to_your_folder/

Étape 3. Envoyez vos modifications à votre dépôt git.

Le dossier sera considéré comme "supprimé" du point de vue de Git (c'est-à-dire qu'ils sont dans l'histoire passée, mais pas dans le dernier commit, et les personnes tirant de ce dépôt verront les fichiers supprimés de leurs arbres), mais restez dans votre répertoire de travail parce que vous avez utilisé --cached.

Tod Birdsall
la source
2
Question rapide, le chemin du dossier doit-il être le chemin complet? ou juste le chemin avec le dépôt git faisant office de base?
HMSCelestia
Je crois que c'est le chemin complet, mais je ne m'en souviens pas avec certitude.
Tod Birdsall du
7
"et les personnes qui retireront de ce référentiel obtiendront les fichiers supprimés de leurs arbres" Puis-je empêcher cela?
Leo Gasparrini
cela a correctement supprimé mes fichiers du suivi sur une branche, mais les a supprimés après une fusion!
Harold
1
pour moi reste encore. Aussi - dois-je désélectionner ces fichiers lors de la validation qui se trouvent dans le dossier? J'ai essayé dans les deux sens. En cas de désélection, cela ne permet pas de pousser, mais j'ai changé un caractère dans un autre fichier qui devrait être suivi.
N'aide
44

Cela fonctionne pour moi:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch est important ici, sans cette option, git se terminera avec une erreur sur le premier fichier qui n'est pas dans l'index.

qed
la source
unknown option 'ignore unmatched'
Inigo
Ceci est un indicateur important si le répertoire est vide, merci!
MNN
très utile si vous souhaitez également supprimer certaines extensions de fichier d'un répertoire:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15
8

Je sais que c'est un vieux fil mais je voulais juste en ajouter un peu car la solution marquée n'a pas résolu le problème pour moi (même si j'ai essayé plusieurs fois).

La seule façon dont je pouvais réellement arrêter git form de suivre le dossier était de faire ce qui suit:

  1. Faites une sauvegarde du dossier local et placez-le dans un endroit sûr.
  2. Supprimez le dossier de votre dépôt local
  3. Assurez-vous que le cache est effacé git rm -r --cached your_folder/
  4. Ajouter your_folder/à .gitignore
  5. Valider les modifications
  6. Ajoutez la sauvegarde dans votre référentiel

Vous devriez maintenant voir que le dossier n'est plus suivi.

Ne me demandez pas pourquoi l'effacement du cache n'a pas fonctionné pour moi, je ne suis pas un super assistant Git mais c'est ainsi que j'ai résolu le problème.

lukehillonline
la source
Je vous remercie!!! Git me rendait fou sans ignorer le dossier eclipse .metadata. Suivez vos étapes avec le dossier eclipse .metadata, et cela a finalement fonctionné.
MasterN8
5

De la documentation git:

Une autre chose utile que vous voudrez peut-être faire est de conserver le fichier dans votre arborescence de travail mais de le supprimer de votre zone de transit. En d'autres termes, vous souhaiterez peut-être conserver le fichier sur votre disque dur mais ne plus laisser Git le suivre. Cela est particulièrement utile si vous avez oublié d'ajouter quelque chose à votre fichier .gitignore et que vous l'avez accidentellement mis en scène, comme un gros fichier journal ou un tas de fichiers compilés .a. Pour ce faire, utilisez l'option --cached:

$ git rm --cached readme.txt

Alors peut-être ne pas inclure le "-r"?

user3750325
la source
1
L'OP a déjà essayé --cached. L' -roption est pour "récursif", qui devrait être inclus dans cette instance.
Chris
J'ai trouvé cela utile. Je cherchais comment le faire sur un dossier, puis je voyais comment le faire sur un fichier. J'inscris ce commentaire.
lumière