.gitignore tous les fichiers .DS_Store dans chaque dossier et sous-dossier

561

J'ai ajouté .DS_Store au fichier .gitignore, mais il semble qu'il ignore uniquement .DS_Store dans le répertoire racine, pas dans tous les dossiers et sous-dossiers.

Comment puis-je réparer ça?

vickyqiu
la source
Comment exactement l'avez-vous ajouté à .gitignore? Cela devrait fonctionner dans tous les répertoires (pour moi).
Thilo
Ça marche aussi pour moi. J'ai également essayé lorsque c'est à la fin du fichier, si vous devez avoir un saut de ligne (spécifique à la plate-forme) mais cela n'a pas changé que les répertoires .DS_Store dans n'importe quelle partie de la hiérarchie étaient toujours ignorés.
enorl76
Si je comprends bien, la question était: comment ignorer facilement toutes les occurrences de .DS_Store dans tous les sous-répertoires sans le faire manuellement dans chaque sous-répertoire. J'ai eu le même problème. La réponse ci-dessous montre comment le résoudre (les 2 derniers paragraphes).
petrsyn

Réponses:

648

Je pense que le problème que vous rencontrez est que dans certains commit précédents, vous avez accidentellement ajouté des .DS_Storefichiers au référentiel. Bien sûr, une fois qu'un fichier est suivi dans votre référentiel, il continuera d'être suivi même s'il correspond à une entrée dans un fichier .gitignore applicable.

Vous devez supprimer manuellement les .DS_Storefichiers qui ont été ajoutés à votre référentiel. Vous pouvez utiliser

git rm --cached .DS_Store

Une fois supprimé, git devrait l'ignorer. Vous ne devriez la ligne suivante dans la racine de votre .gitignorefichier: .DS_Store. N'oubliez pas la période!

git rm --cached .DS_Store

supprime uniquement .DS_Storedu répertoire actuel. Vous pouvez utiliser

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

pour tout supprimer .DS_Storesdu référentiel.

Astuce: comme vous ne voulez probablement jamais inclure de .DS_Storefichiers, créez une règle globale. Créez d'abord un .gitignorefichier global quelque part, par exemple

echo .DS_Store >> ~/.gitignore_global

Dites maintenant à git de l'utiliser pour tous les dépôts:

git config --global core.excludesfile ~/.gitignore_global

Cette page m'a aidé à répondre à votre question.

Edward Newell
la source
41
Les 2 derniers paragraphes répondent à cette question. Merci.
petrsyn
70
´´git rm --cached .DS_Store´´ supprime un seul .DS_Store du répertoire courant. Utilisez ´´find. -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´ pour supprimer tous les .DS_Stores du repo
auco
4
Une liste d'autres fichiers communs à ignorer pourrait être utile
geotheory
14
Mauvaise idée d'utiliser la règle globale IMO: essayer de maintenir des configurations globales sur plusieurs utilisateurs / machines ne fonctionne jamais - vous voulez que les règles régissant votre référentiel dans le référentiel lui-même. D'accord avec cela
Yarin
15
Je ne suis pas d'accord avec toi. (Même si j'ai voté pour votre commentaire car je pense que c'est perspicace.) Si nous faisons globalement, alors chaque utilisateur de mac doit le faire, mais une seule fois. Si nous faisons le référentiel à l'échelle, nous devons le faire pour chaque référentiel. Je ne sais pas pour vous, mais je fais tout le temps de nouveaux dépôts. En le faisant globalement, on résout le problème une fois pour toutes.
Edward Newell
356

Ajouter **/.DS_Storedans .gitignorele sous-répertoire


Si .DS_Storedéjà engagé:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

Pour les ignorer dans tous les dépôts: (parfois il est nommé ._.DS_Store)

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
ronald8192
la source
encore téléchargé dans mon référentiel?
Freddy Sidauruk
@FreddySidauruk utilise d' git rm --cached your_fileabord
ronald8192
@FreddySidauruk Devrait être find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch, de: stackoverflow.com/questions/18393498/…
ronald8192
1
Il semble que l'ajout -fsoit nécessaire si vous avez des fichiers ouverts dans les dossiers pertinents:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Mehmet Kaplan
158

Si .DS_Store n'a jamais été ajouté à votre référentiel git, ajoutez-le simplement à votre fichier .gitignore.

Si vous n'en avez pas, créez un fichier appelé

.gitignore

Dans le répertoire racine de votre application et écrivez simplement

**/.DS_Store

Dedans. Cela ne permettra jamais au fichier .DS_Store de se faufiler dans votre git.

Mais s'il est déjà là, écrivez dans votre terminal:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

puis validez et poussez les modifications pour supprimer le .DS_Store de votre dépôt distant:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

Et maintenant, ajoutez .DS_Store à votre fichier .gitignore, puis recommencez et poussez avec les 2 derniers morceaux de code (git commit ..., git push ...)

drjorgepolanco
la source
3
Pourquoi double astérisque? Qu'est-ce que ça veut dire?
MilanG
1
@MilanG c'est un mot-clé qui signifie essentiellement «rechercher dans ce répertoire et tous les sous-répertoires».
lachie_h
1
Je ne suis pas sûr que ce soit une explication parfaite de ce que signifie le double astérisque. C'est un caractère générique. Pourrait *ou **selon ce que vous voulez réaliser. C'est une façon de dire au shell comment naviguer dans les répertoires. Cette réponse stackoverflow l'explique entièrement stackoverflow.com/a/28199633/4092170
El'Magnifico
** ne correspondra jamais aux répertoires cachés (./): facelessuser.github.io/wcmatch/glob
Jonathan
cela fonctionne réellement ... devrait être marqué comme une réponse
ichimaru
85

Votre fichier .gitignore devrait ressembler à ceci:

# Ignore Mac DS_Store files
.DS_Store

Tant que vous n'incluez pas de barre oblique, elle est comparée au nom de fichier dans tous les répertoires. (d' ici )

Yarin
la source
il est toujours mis en pension
Freddy Sidauruk
@FreddySidauruk alors vous devez courirgit rm --cached path/to/file/here
Sgnl
23

Étape 1, supprimez tous les *.DS_storefichiers. On peut courir

git rm -f *.DS_Store

mais sachez que cela rm -fpeut être un peu dangereux si vous avez une faute de frappe! Deuxième étape: ajouter

*.DS_Store
.DS_Store

à .gitignore. Cela a fonctionné pour moi!

os de voyage
la source
13

Ajoutez *.DS_Storeà votre fichier .gitignore. Cela fonctionne parfaitement pour moi

Jacob
la source
11

Vous pouvez également ajouter l' --cachedindicateur à la réponse d'Auco pour gérer les fichiers locaux .DS_store, comme Edward Newell l'a mentionné dans sa réponse d'origine. La commande modifiée ressemble à ceci: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..cheers et merci!

Andrew Wilhelm
la source
5

Étape: 1) Supprimez les fichiers existants à l'aide de cette commande

trouver . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Étape: 2) Ajoutez .DS_Store dans votre fichier .gitignore

Étape: 3) Validez vos modifications dans .gitignore git add .gitignore git commit -m "supprimé .DS_Store"

vishnu
la source
3
  1. $ git rm ./*.DS_Store - supprimer tous les .DS_Store de git
  2. $ echo \.DS_Store >> .gitignore - ignorer .DS_Store à l'avenir

commit & push

mate.gwozdz
la source