Her iki örnek de veri kaybına yol açabilecek çok kötü örneklerdir!
Benim tavsiyem: asla ekleme /*
Eğer iyi bir nedeniniz yoksa .gitignore dosyalarındaki dizinlere !
İyi bir neden, örneğin Jefromi'nin yazdığı şey olabilir: "daha sonra dizindeki bir şeyi göz ardı etmek istiyorsanız" .
Aksi halde yapılmaması gereken neden, /*
, dizinlere bir yandan dizinin tüm içeriğini doğru şekilde görmezden geldiği şekilde çalışması, ancak diğer yandan tehlikeli bir yan etkiye sahip olmasıdır:
Yürütürseniz git stash -u
(geçici izlenen ve izlenmeyen zulası dosyalara) ya da git clean -df
(izlenmeyen silmek ancak göz ardı dosyaları tutmak) sizin depoda, eklenmiş bir yok sayılır tüm dizinleri /*
olacak geri dönüşü olmayan silindi !
Bazı arka plan
Bunu zor yoldan öğrenmek zorunda kaldım. Benim takımımda Biri ekleme oldu /*
bizim .gitignore bazı dizinlere. Zaman içinde bazı dizinlerin aniden yok olacağı durumlar yaşadım. Uygulamamızın ihtiyaç duyduğu gigabayt yerel verilere sahip dizinler. Kimse açıklayamadı ve her zaman tüm verileri yeniden indirmek için şapka kullanıyorum. Bir süre sonra bununla ilgili olabileceği konusunda bir fikrim var git stash
. Bir gün yerel repo'yu (yok sayılan dosyaları tutarken) temizlemek istedim ve kullanıyordum git clean -df
ve yine verilerim kayboldu. Bu kez yeterince sorun yaşadım ve sorunu araştırdım. Sonunda sebebin eklendiğini anladım /*
.
Bir şekilde directory/*
dizinin tüm içeriğini görmezden geldiği , ancak dizinin kendisini bir şekilde açıklayabileceğini varsayıyorum . Böylece, işler silindiğinde ne izlenir ne de göz ardı edilir. Olsa da git status
vegit status --ignored
üzerinde biraz farklı bir resim verin.
Nasıl çoğaltılır
Davranışı nasıl yeniden oluşturacağınız aşağıda açıklanmıştır. Şu anda Git 2.8.4 kullanıyorum.
İçinde localdata/
kukla bir dosya ile çağrılan bir dizin ( important.dat
) yerel bir git deposunda oluşturulacak /localdata/*
ve .gitignore
dosyaya yerleştirilerek içerik yok sayılacaktır . Bahsedilen iki git komutundan biri şimdi yürütüldüğünde, dizin (beklenmedik şekilde) kaybolacaktır.
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
Eğer bir yaparsanız git status --ignored
burada elde edersiniz:
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/
Şimdi ya
git stash -u
git stash pop
veya
git clean -df
Her iki durumda da göz ardı edildiği iddia edilen dizin localdata
kaybolacaktır!
Bunun bir hata olarak kabul edilip edilemeyeceğinden emin değilim, ama en azından kimsenin ihtiyaç duymadığı bir özellik.
Bunu git geliştirme listesine bildireceğim ve bunun hakkında ne düşündüklerini göreceğim.
.gitignore
saydığı dosyalar ve dizinler arasındaki fark nedir? örneğin,data
vsdata/
farklı şeyler ifade ediyor mu?