.gitignore tutti i file .DS_Store in ogni cartella e sottocartella


561

Ho aggiunto .DS_Store al file .gitignore, ma sembra che stia ignorando solo .DS_Store nella directory principale, non in tutte le cartelle e sottocartelle.

Come posso risolvere questo problema?



Come l'hai aggiunto esattamente a .gitignore? Dovrebbe funzionare in tutte le directory (fa per me).
Thilo,

Funziona anche per me. Ho anche provato quando si trova alla fine del file, se è necessario disporre di una nuova riga (specifica della piattaforma) ma ciò non ha modificato il fatto che le directory .DS_Store all'interno di qualsiasi parte della gerarchia fossero ancora ignorate.
enorl76,

La domanda a quanto ho capito era: Come ignorare facilmente tutte le occorrenze di .DS_Store in tutte le sottodirectory senza farlo manualmente in ogni sottodirectory. Ho avuto lo stesso problema. La risposta di seguito mostra come risolverlo (gli ultimi 2 paragrafi).
petrsyn,

Risposte:


648

Penso che il problema che stai riscontrando sia che in alcuni commit precedenti hai aggiunto accidentalmente .DS_Storefile al repository. Naturalmente, una volta che un file viene tracciato nel tuo repository, continuerà a essere tracciato anche se corrisponde a una voce in un file .gitignore applicabile.

Devi rimuovere manualmente i .DS_Storefile che sono stati aggiunti al tuo repository. Puoi usare

git rm --cached .DS_Store

Una volta rimosso, git dovrebbe ignorarlo. Dovreste solo bisogno la seguente riga nella root .gitignoredel file: .DS_Store. Non dimenticare il periodo!

git rm --cached .DS_Store

rimuove solo .DS_Storedalla directory corrente. Puoi usare

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

per rimuovere tutto .DS_Storesdal repository.

Suggerimento: dal momento che probabilmente non vuoi mai includere i .DS_Storefile, crea una regola globale. Innanzitutto, crea un .gitignorefile globale da qualche parte, ad es

echo .DS_Store >> ~/.gitignore_global

Ora dì a git di usarlo per tutti i repository:

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

Questa pagina mi ha aiutato a rispondere alla tua domanda.


41
Gli ultimi 2 paragrafi rispondono a questa domanda. Grazie.
petrsyn,

70
´´git rm --cached .DS_Store´´ rimuove solo un .DS_Store dalla directory corrente. Usa "Trova. -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´ per rimuovere tutti i .DS_Stores dal repository
auco

4
Un elenco di altri file comuni da ignorare potrebbe essere utile
geotheory

14
Cattiva idea di utilizzare la regola globale IMO: Cercare di mantenere le configurazioni globali su più utenti / macchine non funziona mai: vuoi che le regole che governano il tuo repository nel repository stesso. Sono d'accordo con questo
Yarin,

15
Non sono d'accordo con te (Anche se ho valutato il tuo commento poiché penso che sia perspicace.) Se lo facciamo a livello globale, allora ogni utente Mac deve farlo, ma solo una volta. Se eseguiamo un repository ampio, allora dobbiamo farlo per ogni repository. Non ti conosco, ma faccio sempre nuovi repository. Facendolo a livello globale, si risolve il problema una volta per tutte.
Edward Newell,

356

Aggiungi **/.DS_Storein .gitignoreper la sottodirectory


Se .DS_Storegià commesso:

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

Per ignorarli in tutti i repository: (a volte è chiamato ._.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

ancora caricato nel mio repository?
Freddy Sidauruk,

@FreddySidauruk usa git rm --cached your_fileprima
ronald8192 il

@FreddySidauruk Dovrebbe essere find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch, da: stackoverflow.com/questions/18393498/...
ronald8192

1
Sembra che -fsia necessario aggiungere se hai file aperti nelle cartelle relavent:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Mehmet Kaplan

158

Se .DS_Store non è mai stato aggiunto al tuo repository git, aggiungilo semplicemente al tuo file .gitignore.

Se non ne hai uno, crea un file chiamato

.gitignore

Nella directory principale della tua app e scrivi semplicemente

**/.DS_Store

Dentro. Ciò non consentirà mai al file .DS_Store di intrufolarsi nel tuo git.

Ma, se è già lì, scrivi nel tuo terminale:

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

quindi eseguire il commit e inviare le modifiche per rimuovere .DS_Store dal repository remoto:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

E ora aggiungi .DS_Store al tuo file .gitignore, quindi esegui nuovamente il commit e il push con gli ultimi 2 pezzi di codice (git commit ..., git push ...)


3
Perché doppio asterisco? Cosa significa?
MilanG,

1
@MilanG è una parola chiave che significa sostanzialmente "cerca in questa directory e in tutte le sottodirectory".
lachie_h,

1
Non sono sicuro che sia una spiegazione perfetta di ciò che rappresenta il doppio asterisco. È un jolly. Potrebbe *o in **base a ciò che si desidera ottenere. È un modo per dire alla shell come navigare nelle directory. Questa risposta StackOverflow lo spiega completamente StackOverflow.com/a/28199633/4092170
El'Magnifico

** non corrisponderà mai alle directory nascoste (./): facelessuser.github.io/wcmatch/glob
Jonathan

questo funziona davvero ... dovrebbe essere contrassegnato come risposta
ichimaru,

85

Il tuo file .gitignore dovrebbe assomigliare a questo:

# Ignore Mac DS_Store files
.DS_Store

Fintanto che non includi una barra, questa viene abbinata al nome del file in tutte le directory. (da qui )


è ancora convertito in repo
Freddy Sidauruk il

@FreddySidauruk allora devi correregit rm --cached path/to/file/here
Sgnl

23

Passo 1, elimina tutti i *.DS_storefile. Uno può correre

git rm -f *.DS_Store

ma tieni presente che rm -fpuò essere un po 'pericoloso se hai un refuso! Passaggio due: aggiungi

*.DS_Store
.DS_Store

a .gitignore. Questo ha funzionato per me!


13

Aggiungi *.DS_Storeal tuo file .gitignore. Funziona perfettamente per me


11

Puoi anche aggiungere il --cachedflag alla risposta di auco per mantenere i file .DS_store locali, come menzionato da Edward Newell nella sua risposta originale. Il comando modificato è simile al seguente: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..cheers e grazie!


5

Passaggio: 1) Rimuovere i file esistenti utilizzando questo comando

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

Passaggio: 2) Aggiungi .DS_Store al tuo file .gitignore

Passaggio: 3) Conferma le modifiche in .gitignore git aggiungi .gitignore git commit -m "rimosso .DS_Store"


3
  1. $ git rm ./*.DS_Store - rimuove tutto .DS_Store da git
  2. $ echo \.DS_Store >> .gitignore - ignora .DS_Store in futuro

impegnarsi e spingere

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.