Come posso rimuovere i file .DS_Store da un repository Git?


Risposte:


2430

Rimuovere i file esistenti dal repository:

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

Aggiungi la linea

.DS_Store

al file .gitignore, che può essere trovato al livello superiore del repository (o creato se non è già presente). Puoi farlo facilmente con questo comando nella directory principale

echo .DS_Store >> .gitignore

Poi

git add .gitignore
git commit -m '.DS_Store banished!'

13
È davvero banale, ma l'utilizzo -execverrà avviato git-rmuna volta per ogni file .DS_Store, mentre xargsmetterà tutti i percorsi su una riga di comando. Principalmente preferisco xargsperché non devo preoccuparmi di sfuggire a molti personaggi speciali.
benzado,

8
Questo dovrebbe usare .git / info / exclude, non .gitignore. Vedi stackoverflow.com/questions/1753070/… per una spiegazione della differenza tra i due.
Andrew Grimm,

106
@Andrew: non sono d'accordo. Non sarebbe mai utile per il check-in di un file .DS_Store, quindi ha più senso come impostazione a livello di repository, per tutti gli utenti, piuttosto che qualcosa che ogni utente Mac deve ricordare di impostare sul proprio computer.
benzado,

51
L'aggiunta .DS_Storeal .gitignorelavoro ricorsivamente? Cioè, ignorerà some/level/of/folders/.DS_Storeanche?
Charlie Schliesser,

70
@CharlieS Sì, se il modello non contiene una barra, viene confrontato con il nome del file in tutte le directory.
benzado,

239

Combinando le risposte di benzado e webmat, aggiornando con git rm, senza errori sui file trovati che non sono in repository, e rendendolo incollabile genericamente per qualsiasi utente:

# remove any existing files from the repo, skipping over ones not in repo
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
# specify a global exclusion list
git config --global core.excludesfile ~/.gitignore
# adding .DS_Store to that list
echo .DS_Store >> ~/.gitignore

2
Ho scoperto che quando uso un repository git nella mia directory home (AKA un repo "dotfiles"), avere ~/.gitignorecome mio file di esclusione globale è una seccatura. Ci sono file che voglio escludere dalla mia directory home che non voglio ignorare a livello globale. Uso ~/.gitexcludesinvece tramite la stessa direttiva:core.excludesfile
AL il X

156

La migliore soluzione per affrontare questo problema è ignorare globalmente questi file da tutti i repository git sul tuo sistema. Questo può essere fatto creando un file gitignore globale come:

vi ~/.gitignore_global

Aggiunta di regole per ignorare i file come:

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Ora, aggiungi questo file alla tua configurazione globale di git:

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

Modificare:

Rimosse le icone in quanto potrebbe essere necessario impegnarle come risorse dell'applicazione.


Puoi anche aggiungere le regole sopra nel .gitignore del tuo repository. Ciò manterrebbe questi file a livello di repository se ci sono più collaboratori al progetto. Tuttavia, in questi casi, .gitignore dovrebbe occuparsi dei file specifici di ogni sistema operativo ecc. Se sviluppatori diversi utilizzano sistemi operativi diversi. Come le regole per Linux, OSX ecc.
Nerve,

Vorrei raccomandare a ogni sviluppatore di gestire i propri file specifici di sistema operativo nel proprio .global_ignore, in questo modo il progetto .gitignore è specifico del progetto.
mcfedr,

deve essere eseguito: git add .gitignore_global, affinché un altro programmatore abbia anche quel file nel suo ambiente locale?
stackdave,

58

In alcune situazioni potresti anche voler ignorare alcuni file a livello globale. Per me, .DS_Store è uno di questi. Ecco come:

git config --global core.excludesfile /Users/mat/.gitignore

(O qualsiasi file di tua scelta)

Quindi modificare il file proprio come .gitignore di un repository. Nota che penso che devi usare un percorso assoluto.


26

Se non riesci a rimuovere i file perché presentano modifiche in fasi, usa:

git rm --cached -f *.DS_Store

19

Apri il terminale e digita "cd <ProjectPath>"

  1. Rimuovi i file esistenti: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. Aggiungi questo .DS_Store

  4. digitare "ctrl + x"

  5. Digita "y"

  6. Invio per salvare il file

  7. git add .gitignore

  8. git commit -m '.DS_Store removed.'


nano .gitignorecrea il file se non presente, questo comando dovrebbe essere eseguito dalla cartella principale del progetto
Saif

17

La risposta più votata è fantastica, ma aiutando i principianti come me, ecco come creare il file .gitignore, modificarlo, salvarlo, rimuovere i file che potresti aver già aggiunto a Git, quindi inviare il file su Github.

Crea il file .gitignore

Per creare un file .gitignore, è possibile solo touchil file che crea un file vuoto con il nome specificato. Vogliamo creare il file denominato .gitignore in modo da poter usare il comando:

touch .gitignore

Ignora i file

Ora devi aggiungere la riga che dice a git di ignorare i file di DS Store sul tuo .gitignore. È possibile utilizzare l'editor nano per farlo.

nano .gitignore

Nano è carino perché include le istruzioni su come uscirne. ( Ctrl- Oper salvare, Ctrl- Xper uscire)

Copia e incolla alcune delle idee da questa sintesi di Github che elenca alcuni file comuni da ignorare. I più importanti, per rispondere a questa domanda, sarebbero:

# OS generated files #
######################
.DS_Store
.DS_Store?

I # sono commenti e ti aiuteranno a organizzare il tuo file man mano che cresce.

Questo articolo di Github contiene anche alcune idee e linee guida generali.

Rimuovi i file già aggiunti a git

Infine, devi effettivamente rimuovere quei file di DS Store dalla tua directory.

Usa questo ottimo comando dalla risposta più votata. Questo passerà attraverso tutte le cartelle nella tua directory e rimuoverà quei file da Git.

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

Spingi .gitignore fino a Github

Ultimo passaggio, devi effettivamente eseguire il commit del tuo file .gitignore.

git status

git add .gitignore

git commit -m '.DS_Store banished!'


3
il comando touch nei tuoi passaggi non è necessario ... nano creerà il file per te.
Corey Goldberg

1
Ho trovato la mia risposta 2 anni dopo e l'ho usata. Ottimo lavoro oltre me. :)
Joshua Dance

Ha funzionato perfettamente !! Grazie
iUser

15

Ho dovuto cambiare git-rm in git rm in sopra per farlo funzionare:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print

10

eliminali usando git-rm, quindi aggiungi .DS_Store .gitignoreper impedire che vengano aggiunti di nuovo. Puoi anche usare blueharvest per impedire che vengano creati tutti insieme


9

Nel caso in cui desideri rimuovere i file DS_Store in ogni cartella e sottocartella:


In caso di DS_Store già impegnato:

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

Ignorali con:

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

8

Quanto segue ha funzionato meglio per me. Gestito file senza eguali e file con modifiche locali. Per riferimento, questo era su un sistema Mac 10.7 con git 1.7.4.4.

Trova e rimuovi:

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

Inoltre ignoro a livello globale .DS_Store in tutti i repository impostando un core.excludesfile globale.

Innanzitutto, crea il file (se non ne esiste già uno):

touch ~/.gitignore

Quindi aggiungere la seguente riga e salvare:

.DS_Store

Ora configura git per rispettare il file a livello globale:

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

8

Utilizzare questo comando per rimuovere i file esistenti:

find . -name '*.DS_Store' -type f -delete

Quindi aggiungi .DS_Storea.gitignore


6

Ho scoperto che la seguente riga di snipplr fa meglio a cancellare tutto .DS_Store, incluso uno con modifiche locali.

find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print

--cachedopzione, mantiene il tuo locale .DS_Storepoiché verrà comunque riprodotto.

E proprio come menzionato sopra, aggiungi .DS_Storeal file .gitignore sulla radice del tuo progetto. Quindi non sarà più alla tua vista (di pronti contro termine).


5

Sono un po 'in ritardo alla festa, ma ho una buona risposta. Per rimuovere i file .DS_Store, utilizzare i seguenti comandi da una finestra del terminale, ma fare molta attenzione a eliminare i file con 'trova'. L'uso di un nome specifico con l'opzione -name è uno dei modi più sicuri per usarlo:

cd directory/above/affected/workareas
find . -name .DS_Store -delete

Puoi lasciare "-delete" se vuoi semplicemente elencarli prima e dopo. Questo ti rassicurerà che se ne sono andati.

Per quanto riguarda il consiglio ~ / .gitignore_global: fai attenzione qui. Vuoi mettere quel bel file in .gitignore all'interno del livello più alto di ogni area di lavoro e impegnarlo, in modo che chiunque cloni il tuo repository ne trarrà vantaggio.


4

Questo funzionerà:

find . -name "*.DS_Store" -type f -exec git-rm {} \;

Elimina tutti i file i cui nomi terminano .DS_Store, incluso ._.DS_Store.


3
L'asterisco non dovrebbe essere lì dentro.
Aristotele Pagaltzis,

3
l'asterisco dovrebbe essere lì perché ho trovato i file .DS_Store e ._. DS_Store sul mio sistema mac.
MutantMahesh,

3
@MutantMahesh. In tal caso, è necessario "*.DS_Store", in modo che l'asterisco venga passato findanziché espanso dalla shell.
TRiG,

4

Per qualche motivo nessuno dei precedenti ha funzionato sul mio mac.

La mia soluzione è dal terminale:

rm .DS_Store

Quindi eseguire il comando seguente:

git pull origin master

3
$ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
$ git push origin master --force

3

Quando si inizializza il repository, saltare il comando git che contiene

-u

e non dovrebbe essere un problema.


1
E se qualcun altro ha creato il repository e OP si sta solo sincronizzando con esso?
JWW

3

Questo ha funzionato per me, combo di due risposte dall'alto:

  • $ git rm --cached -f * .DS_Store
  • $ git commit -m "filtro-ramo --index-filtro 'git rm --cached --ignore-unmatch .DS_Store"
  • $ git push origin master --force

3

Rimuovi i file ignorati:

(.DS_Store)

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

2

Esistono alcune soluzioni per risolvere questo problema. Per evitare la creazione di file .DS_Store, non utilizzare OS X Finder per visualizzare le cartelle. Un modo alternativo per visualizzare le cartelle è utilizzare la riga di comando UNIX. Per rimuovere i file .DS_Store è possibile utilizzare un prodotto di terze parti chiamato DS_Store Terminator. Per eliminare i file .DS_Store dall'intero sistema è possibile utilizzare un comando shell UNIX. Avvia Terminale da Applicazioni: Utilità Al prompt della shell UNIX, immettere il seguente comando UNIX: sudo find / -name ".DS_Store" -depth -exec rm {} \; Quando viene richiesta una password, immettere la password dell'amministratore di Mac OS X.

Questo comando serve a trovare e rimuovere tutte le occorrenze di .DS_Store a partire dalla radice (/) del file system attraverso l'intero computer. Per configurare questo comando per l'esecuzione come attività pianificata, procedere come segue: Avvia Terminale da Applicazioni: Utilità Al prompt della shell UNIX, immettere il seguente comando UNIX:

sudo crontab -e Quando viene richiesta una password, immettere la password dell'amministratore di Mac OS X. Una volta nell'editor vi, premi una volta la lettera I sulla tastiera e inserisci quanto segue:

15 1 * * * root find / -name ".DS_Store" -depth -exec rm {} \;

Questo si chiama voce crontab, che ha il seguente formato:

Minuto Ora Giorno Giorno Mese Giorno Giorno Comando utente settimana.

La voce crontab significa che il comando verrà eseguito automaticamente dal sistema ogni giorno all'1: 15 AM dall'account chiamato root.

Il comando inizia da trova fino a. Se il sistema non è in esecuzione, questo comando non verrà eseguito.

Per salvare la voce premere una volta il tasto Esc, quindi premere contemporaneamente Shift + z + z.

Nota: le informazioni nel passaggio 4 sono solo per l'editor vi.


2

aggiungi questo al tuo file .gitignore

#Ignore folder mac
.DS_Store

salva questo e fai il commit

git add -A
git commit -m "ignore .DS_Store"

e ora lo ignori per tutti i tuoi impegni


2

crea un .gitignorefile usando il comandotouch .gitignore

e aggiungi le seguenti righe

.DS_Store

salva il .gitignorefile e poi inseriscilo nel tuo repository git.


2

Il modo migliore per sbarazzarsi di questo file per sempre e non doversi più preoccupare di questo è

crea un file .gitignore globale:

echo .DS_Store >> ~ / .gitignore_global

E fai sapere a git che vuoi usare questo file per tutti i tuoi repository:

git config --global core.excludesfile ~ / .gitignore_global E questo è tutto! .DS_Store è fuori dai piedi.


1

Non è necessario rimuovere .DS_STORElocalmente

Aggiungilo al .gitignorefile

Il file .gitignore è solo un file di testo che dice a Git quali file o cartelle ignorare in un progetto.

comandi

  • nano .gitignore
  • Scrivi .DS_Storequindi fare clic suCTRL+X > y > Hit Return
  • git status Per dare un'ultima occhiata alle tue modifiche
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master
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.