Entrambi gli esempi nella domanda sono in realtà esempi molto cattivi che possono portare alla perdita di dati!
Il mio consiglio: non aggiungere mai /*
alle directory nei file .gitignore, a meno che tu non abbia una buona ragione!
Un buon motivo potrebbe essere, ad esempio, ciò che scrisse Jefromi: "se si intende successivamente ignorare qualcosa nella directory" .
Il motivo per cui altrimenti non dovrebbe essere fatto è che l'aggiunta /*
alle directory funziona da un lato nel modo in cui ignora correttamente tutto il contenuto della directory, ma dall'altro ha un pericoloso effetto collaterale:
Se si esegue git stash -u
(per archiviare temporaneamente file tracciati e non tracciati) o git clean -df
(per eliminare file non tracciati ma mantenendo file ignorati) nel proprio repository, tutte le directory che vengono ignorate con un allegato /*
verranno eliminate in modo irreversibile !
Qualche sfondo
Ho dovuto imparare questo nel modo più duro. Qualcuno nel mio team stava aggiungendo /*
alcune directory nel nostro .gitignore. Nel corso del tempo ho avuto occasioni in cui alcune directory sarebbero improvvisamente scomparse. Directory con gigabyte di dati locali necessari per la nostra applicazione. Nessuno poteva spiegarlo e odio sempre scaricare nuovamente tutti i dati. Dopo un po 'ho avuto l'idea che avrebbe potuto avere a che fare con git stash
. Un giorno volevo ripulire il mio repository locale (mantenendo i file ignorati) e stavo usando git clean -df
e di nuovo i miei dati erano spariti. Questa volta ne ho avuto abbastanza e ho indagato sul problema. Ho finalmente capito che il motivo è l'annesso /*
.
Presumo che possa essere spiegato in qualche modo dal fatto che directory/*
ignora tutti i contenuti della directory ma non la directory stessa. Quindi non viene considerato tracciato né ignorato quando le cose vengono eliminate. Anche se git status
e git status --ignored
dare un'immagine leggermente diversa su di esso.
Come riprodurre
Ecco come riprodurre il comportamento. Attualmente sto usando Git 2.8.4.
Una directory chiamata localdata/
con un file fittizio ( important.dat
) verrà creata in un repository git locale e il contenuto verrà ignorato inserendolo /localdata/*
nel .gitignore
file. Quando uno dei due comandi git menzionati viene eseguito ora, la directory andrà (inaspettatamente) perduta.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
Se fai un git status --ignored
qui, otterrai:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
Adesso neanche
git stash -u
git stash pop
o
git clean -df
In entrambi i casi la directory presumibilmente ignorata localdata
sparirà!
Non sono sicuro che questo possa essere considerato un bug, ma immagino sia almeno una caratteristica di cui nessuno ha bisogno.
Lo riferirò alla lista di sviluppo di git e vedrò cosa ne pensano.
.gitignore
differenza tra file e directory che ignora? per esempio,data
vsdata/
significa cose diverse?