Ignorer le contenu d'un répertoire déjà enregistré?

227

J'ai un dépôt git qui est utilisé uniquement pour contenir des fichiers graphiques et sonores utilisés dans plusieurs projets. Ils sont tous dans un répertoire sans sous-répertoires. Maintenant, je viens de créer un script pour copier ces actifs à partir d'un autre répertoire structuré, avec plusieurs niveaux de sous-répertoires.

Maintenant, je veux seulement que la structure de fichiers hiérarchique (source) soit suivie par git, et le répertoire plat (cible) (avec tous les fichiers dans une pile) doit être ignoré.

J'ai ajouté le répertoire cible à .gitignore, mais git suit toujours les modifications. Je pensais que si je validais la suppression de l'ancien fichier dans le répertoire cible, git pourrait arrêter de suivre le nouveau contenu (copié par le script), mais ce n'est pas le cas.

Comment faire pour que git oublie le répertoire cible?

Felixyz
la source
Quel est le nom du répertoire et qu'avez-vous mis dans .gitignore
mmmmmm
1
Le nom est DirNameIrrelevant et dans .gitignore, j'ai essayé de mettre "DirNameIrrelevant", "DirNameIrrelevant /" et "DirNameIrrelevant / *"
Felixyz

Réponses:

524

Cette commande amènera git à ne pas suivre votre répertoire et tous les fichiers qu'il contient sans les supprimer réellement:

git rm -r --cached <your directory>

le -r option entraîne la suppression de tous les fichiers de votre répertoire.

L' --cachedoption entraîne la suppression des fichiers uniquement de l'index de git, pas de votre copie de travail. Par défaut git rm <file>, supprimerait <file>.

Gordon Wilson
la source
Ah merci. Très utile, même si je ne vois pas pourquoi cela devrait être nécessaire (pourquoi ne suffit-il pas d'ajouter le répertoire dans .gitignore?). Pourriez-vous me dire à quoi sert le --cached?
Felixyz
sûr. J'ai modifié ma réponse pour décrire les deux options.
Gordon Wilson
Quant à savoir pourquoi cela est nécessaire, je ne peux que spéculer. Je suppose que les créateurs voulaient que le non-suivi des fichiers soit explicite afin de réduire les risques de non-suivi par erreur des parties importantes de votre projet. J'imagine qu'il y a aussi des raisons techniques.
Gordon Wilson
15
Le gitignore est utilisé pour déterminer les fichiers non suivis dont git aura connaissance; cela n'a aucune incidence sur les fichiers déjà suivis. Si l'utilisateur veut suivre les fichiers autrement ignorés, git le permet. Cela pourrait être fait en utilisant add -fou être votre situation. Comme l'a dit Gordon, cela vous empêche d'effacer accidentellement un tas de fichiers - le référentiel est la liste principale, pas le gitignore. Cela vous permet également de suivre manuellement quelques éléments qui autrement seraient ignorés par une règle générique, ce que j'ai trouvé utile.
Cascabel
L' -roption n'est pas de "provoquer la suppression de tous les fichiers de votre répertoire" mais plutôt de récurrer via les sous-répertoires.
MrE
78

Si vous avez besoin d'un fichier suivi (archivé), mais que vous ne souhaitez pas suivre les modifications ultérieures d'un fichier tout en le conservant dans votre référentiel local ainsi que dans le référentiel distant, cela peut être fait avec:

git update-index --assume-unchanged path/to/file.txt

Après cela, aucune modification de ce fichier n'apparaîtra dans git status.

jone
la source
1
Bien que OP ait peut-être demandé un répertoire, c'est exactement ce que je cherchais - ignorer les autres modifications apportées à un seul fichier archivé; Merci!
sdaau
1
pour ignorer complètement un répertoire, utilisez 'git update-index --assume-unchanged dirName / *'. Il m'a fallu un certain temps pour trouver la syntaxe, '*' est nécessaire ici
J-Dizzle
1
Comment inverser cela?
Rhys
3
@Rhys pour l'inverser:git update-index --no-assume-unchanged dirname/**/*
JobJob
3

Pour un sous-répertoire appelé blah/ajouté à git, les deux éléments suivants semblent fonctionner pour ignorer les nouveaux fichiers dans blah/. Ajouté à .gitignore:

blah 
blah/*
Stef
la source
1

TL; DR pour nettoyer votre référentiel git et vous assurer que TOUS vos éléments ignorés sont en effet ignorés:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Remarque: vous n'avez pas besoin de spécifier un répertoire, de cette façon, vous nettoyez l' intégralité du référentiel distant .

Pour aller plus loin lisez ceci

Ced
la source
0

Je ne sais pas si cela compte ou fait de moi une mauvaise personne, mais c'est parti.

  1. J'ai ajouté *Generated* au fichier racine .gitignore
  2. J'ai soumis les fichiers que je souhaite conserver en tant que GeneratedFile.Wwhat.ext.Enregistré
  3. J'ai fait un crochet git à la sortie de la caisse pour appeler un script PowerShell en faisant ceci:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Je me sens un peu mal pour moi ... mais ça marche en fait.

Steve
la source
-2

Ok, il semble que vous devez d'abord faire un check-in avec le répertoire complètement vide (ni anciens ni nouveaux fichiers), et tous les fichiers ajoutés par la suite seront ignorés. Si vous supprimez les anciens fichiers ajoutés et les nouveaux avant de les valider, les nouveaux sont ajoutés au référentiel bien qu'ils doivent être ignorés.

Au moins, cela a fonctionné pour moi dans cette situation. Ce serait toujours bien si quelqu'un pouvait fournir plus d'informations sur ce qui se passe.

Felixyz
la source
1
Version courte de ce que nous avons dit ailleurs - le gitignore affecte ce que git de données non suivies connaîtra. Cela n'affecte pas ce qui sera fait avec les données dont vous lui avez parlé (par exemple, vous avez demandé de les ajouter au référentiel).
Cascabel
Il est donc logique que les fichiers qui ont été suivis et qui sont maintenant supprimés soient suivis en tant que tels, mais cela n'a toujours aucun sens pour moi que les fichiers ajoutés (si cela est fait avant le prochain commit) soient suivis, alors que si je 1) ignorer, 2) supprimer des fichiers, 3) valider, 4) ajouter un nouveau fichier, les nouveaux fichiers ne sont pas suivis.
Felixyz