gitignore kullanarak dosyaları yok saymak (ancak silmek değil)


98

Git depomda bir tmp dizinim var, hala var olmak istiyorum, ancak görmezden gelin. Bunun eklendi .gitignoreama git statushala o dizindeki dosyalara değişiklikler hakkında söylüyor. Denedim git rm -r --cached, ama bu onu uzak depodan kaldırıyor. Bu dizindeki değişiklikleri izlemeyi nasıl durdurabilirim, ancak yine de var olmasına izin verebilirim? Bunu 1 dosya için de yapmam gerekiyor, ancak bunda yapılan değişiklikler de onları yükledikten git statussonra görünüyor .gitignore. Ne yapmalıyım?


1
lütfen .gitignore dosyanızın tam olarak nasıl göründüğünü yazın.
kdehairy

Yanıtlar:


184

Bunun yerine, .gitignoreaşağıdaki komutu çalıştırarak yerel git deposunu güncelleyebilirsiniz:

git update-index --assume-unchanged <file>

Bu durumda, kaynak deposunda bir dosya izleniyor. Yerel deponuzda değiştirebilirsiniz ve git onu asla değiştirilmiş olarak işaretlemeyecektir. Da daha fazlasını oku:


22
Git sevgim ikiye katlanmış olabilir.
Mark Fox

2
Kabul edilen cevap bu olmalıdır. Bağlantı verdiğiniz için teşekkürler.
Gowiem

4
Bunu uzak depoya aktarmanın bir yolu var mı?
Brian Ortiz

2
hmm bir dosyayı "o bir git dosyası değil, başka bir
depoda

11
İle geri döndürebilirsiniz git update-index --no-assume-unchanged <file>. Bunları listelemek istersen git ls-files -v | grep '^h'.
Sanghyun Lee

12

Dosyaların var olmasına izin verirken yapılan değişiklikleri göz ardı etmek tam amacıdır .gitignore. Dolayısıyla .gitignore, yapmanız gereken tek şey dosyaları (veya dizinleri) eklemek .

Ama senin sorunun şu ki git, görmezden gelmek istediğin dosyaları zaten izliyor ve .gitignoreizlenen dosyalara uygulanmıyor. Bu takibi durdurmanın tek yolu git'e onları kaldırmasını söylemektir. Kullanarak git rm --cachedgit'in yerel dosyalarınızı silmesini engellersiniz, ancak değişikliklerinizi alan diğer tüm havuzlar kaldırmayı uygulayacaktır. Bunu kendi deponuzdan önlemenin bir yolu olduğunu sanmıyorum. Diğer depolarda bir şeyler yapmalısınız, aksi takdirde dosyaların kaldırılacağını kabul edin.

Birbirinizin depoda kaldırılmasını önlemek için şunları yapabilirsiniz:

  • (belli ki) dosyaları bir yere yedekleyin, değişiklikleri çekin ve dosyaları geri yükleyin,
  • veya değişikliklerinizi çekmeden öncegit rm --cached dosyaları ve kesin . Git, zaten izlenmemiş dosyalara dokunmadan iki kaldırma işlemini güzelce birleştirecektir.

6
Bunun doğru olması gerekmez ("izlemeyi durdur = dosyayı kaldır"). Hala bir dosya, bir repo izlenir ve kullanan herhangi bir değişiklik yapılmış görmemeye sahip olabilir: git update-index --assume-unchanged <file>. : Bir göz atın blog.pagebakers.nl/2009/01/29/...
ducin

bu benim sorunumu çözdü çünkü git'te itilen depodan dosyayı kaldırmam gerekiyor git rm --cached <filename> -r ve bu itmeden sonra tekrar depoya
dönerek

7

Dosyanıza /dizin adının sonuna bir koyun .gitignore, örn.

tmp/

Bu dizinde izlenen dosyalarınız varsa, git'e önce onları unutmasını söylemeniz gerekir (dizini yoksay listesine eklemeden önce). Orada hayati bir şey olmadığını varsayarsak (yani onu çizebilirsin):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Bu dizindeki yeni dosyalar izlenmeyecektir.

--cachedSeçeneği git rmendeksi sadece eser (az ya da çok bekleyen değişiklikleri). Çalışma ağacı veya neyin izlenip izlenmediğinin durumu üzerinde hiçbir etkisi yoktur.


Bende var. Hem the/dir/vethe/dir/*
21312312

Hey Mat, farklı klasörlerde / Media gibi göz ardı etmek istediğim bir şey varsa, bu mümkün mü? Yani / 1 / Media, / 2 / Media, 99'u sevecek kadar mı?
Nic


1

Bir dosyayı izlemeye (örn. index.php), Uzak bir depoya eklemeye, ardından dosyayı uzaktan kumandada tutarken izlemeyi bırakmaya çalışıyormuşsunuz gibi geliyor (yani index.php, yerel olarak değiştirirken uzak depoda değişmeden tutun ).

Anladığım kadarıyla git bunu yapamaz. Bir dosyayı izleyebilir veya takip edemezsiniz. Bir dosyayı izlerseniz, uzak depoda bulunur ve dosyada değişiklik yaptığınızda değişir. Bir dosyayı izlemezseniz, uzak depoda bulunmaz.

Git ile tam olarak istediğinizi yapmak mümkün olmadığından, tam olarak durumunuza bağlı olarak potansiyel olarak başka çözümler de vardır. Örneğin, index.phpyerel olarak değiştirirken neden uzaktan kumandayı değiştirmek istemiyorsunuz? Dosyada kullanıcıya özel ayarlar var mı? Bu durumda şunları yapabilirsiniz:

cp index.php index_template.php
git rm --cached index.php

Şimdi index_template.php'yi uzak depoda görünmesini istediğiniz gibi düzenleyin. README'nize bir şeyler ekleyin ve deponuzu kullanan kişilere, bir kez kopyaladıklarında index_template.php'yi index.php'ye kopyalayıp ihtiyaçlarına göre düzenlemeleri gerektiğini söyleyin.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Biri sizin deponuzu klonladığında, kendi deponuzu yaratması gerekir index.php. Sen onlar için kolay bunu yaptık: basitçe kopyalayıp index_template.phpiçin index.phpve bilgisayara özgü ayarlarla revize.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.