Git neden belirtilen dosyamı görmezden gelmiyor?


195

Aşağıdaki satırı ekledim .gitignore:

sites/default/settings.php

ancak git statusyazdığımda dosyayı eksiz dosya olarak gösteriyor.

Sorun ne? Diğer tüm modeller iyi çalışır.



Aynı sorunu yaşadım, sonra .gitignore dosyamı farklı bir sürücüye kaydettiğimi keşfettim: face-palm:
Henry Chan

Deponuzda bir şeyler tutmak ve üzerindeki değişiklikleri göz ardı etmek çok kötü bir fikirdir.
Yevgeniy Afanasyev

Yanıtlar:


370

Emin senin emin olun .gitignoreçalışma dizininin kökü olduğunu ve bu dizin vadede git statusve kopya durum çıkışından dosyanın yolunu ve yapıştırın .gitignore.

Bu işe yaramazsa, dosyanızın Git tarafından zaten izlenmiş olması muhtemeldir. Bunu çıktısıyla onaylayabilirsiniz git status. Dosya “İzlenmeyen dosyalar” bölümünde listelenmemişse, Git tarafından zaten izlenir ve kuralı .gitignoredosyadan yok sayar .

Git'teki dosyaları yok saymanın nedeni, depoya eklenmeyecek olmasıdır. Daha önce yoksayılmasını istediğiniz bir dosya eklediyseniz, Git tarafından izlenir ve onunla eşleşen yoksayma kuralları atlanır. Git bunu zaten deponun bir parçası olduğu için yapar.

Dosyayı gerçekten görmezden gelmek için dosyayı kaldırmanız ve depodan kaldırmanız gerekir. Bunu kullanarak yapabilirsiniz git rm --cached sites/default/settings.php. Bu, dosyayı fiziksel olarak silmeden dosyayı depodan kaldırır (ne --cachedyaparsa yapın). Bu değişikliği yaptıktan sonra dosya depodan kaldırılır ve yoksayılması düzgün çalışmalıdır.


'Çalışma dizininin kökü' ile ne demek istiyorsun? '.Git' deposunun bulunduğu dizin?
Jonathan Leffler

Çalışma dizini, dizinin .gitbulunduğu ve kendisinin deponun kökü olduğu dizindir. Bir depoyu klonladığınızda, /xy/o zaman /xy/çalışma dizininiz /xy/.git/içeride.
dürtmek

3
Bazen dizini düzgün bir şekilde yeniden oluşturmak için bir git add .sonra da yapmanız gerekir git rm --cached.
Cooper

Git durumunda kontrol etmek fikri mükemmeldi. Eclipse Git Aşama'da kontrol etmeye devam ettim ve yol yanlıştı. Teşekkürler!
walla

1
İç içe geçmiş klasörler de vardı gibi -r (özyinelemeli) bayrağı eklemek gerekiyordu. Benim durumumda git klasörünün köküne taşındıktan sonra git rm --cached -r .vs / komutunu çalıştırdım.
Devology Ltd

106

Bu sorunla karşılaşıyorum, bu eski bir soru, ama bu dosyanın izlenmesini istiyorum ancak belirli çalışma kopyalarında izlemek istemiyorum, bunu yapmak için

git update-index --assume-unchanged sites/default/settings.php

5
Aslında aradığım cevap bu. Diğer tüm yanıtlar, dosyanın git add ile eklendiğini varsayar; bu her zaman böyle değildir. Acquia Cloud ile .gitignore dosyasının settings.php'yi (örneğin) yoksayması beklenir, ancak dosya ilk işleme dahil edilir. Dosyanın izini kaldırmak, dosyayı depodan siler, böylece canlı siteden siler ...
PatrickS

Bana da yardım etti - teşekkürler! Oy verildi. Ben sadece yerel git repo için geçerli ve bir kez uzaktan itti ve diğer geliştiriciler tarafından klonlanmış devam etmedi olsa şüpheli?
Ivan

1
Evet, sadece yerel.
Mescalito

41

.gitignore yalnızca deponuza henüz eklemediğiniz dosyaları yoksayar.

Bir yaptıysanız git add .ve dosya dizine eklendiyse, .gitignore size yardımcı olmaz. git rm sites/default/settings.phpKaldırmak için yapmanız gerekecek ve daha sonra yok sayılacaktır.


thanks.but Dosyayı çalışma dizininden değil, yalnızca dizinden nasıl kaldırabilirim?
Nick.h

1
git rmbunu yapmanız gerekir, ancak siz onu çalışma dizininden kaldıracak -f seçeneğini kullanmanızı isteyebilir. Dosyanın bir kopyasını oluşturmak, kopyasını yapmak git rm -fve geri yüklemek dışında bunu anlayamadım .
jonescb

Aynı adam. Bir yere kopyalayın, kaldırın, kaldırıldı durumunu kesin, dosyaları geri ekleyin ve şimdi nasıl yok sayıldıklarını görün.
Yevgeniy Afanasyev

18

Lütfen bu komutu kullanın

git rm -rf --cached .
git add .

Bazen .gitignore dosyaları doğru olsalar bile çalışmaz. Git'in dosyaları yok saymasının nedeni, dosyaların depoya eklenmemesidir. Daha önce yoksaymak istediğiniz bir dosya eklediyseniz, Git tarafından izlenir ve atlama eşleme kuralları atlanır. Git bunu zaten yapıyor çünkü dosya zaten deponun bir parçası.


12

Ben de aynı problemi yaşadım. .gitingoreÇalışırken izlenmeyen dosyalar olarak listelenen yerlerde tanımlanan dosyalar git status.

Bunun nedeni, .gitignoredosyanın UTF-16LEkodlamaya değil, UTF8kodlamaya kaydedilmesiydi.

.gitignoreDosyanın kodlamasını değiştirdikten sonra UTF8benim için çalıştı.


Bu yüzden bir çaylak gibi hissediyorum ... dang it Windows
Coty Embry

Dosya kodlamanın neden önemli olduğu hakkında bir fikriniz var mı? Belki yolu düzgün okumuyor musunuz?
Chargnn

2

Settings.php dosyasını başarıyla yoksaymak için ne yaptım :

  1. git rm - önbelleğe alınmış siteler / default / settings.php
  2. taahhüt (buraya kadar işe yaramadı)
  3. manuel olarak silinen siteler / varsayılan / settings.php (bu işe yaradı)
  4. git ekleyin.
  5. commit (başarıyla yoksayıldı)

Git'te kaydedilen dosya varsa, yoksayma beklendiği gibi çalışmaz. Sadece dosyayı silin ve onaylayın. Daha sonra görmezden gelecektir.


2

Git'te izlenmesini istediğim uygulama Yapılandırma dosyaları gibi örnekler vardır (yani .gitignore çalışmaz), ancak yerel ayarlar için değiştirmem gerekiyor. Git'in bu dosyaları yönetmesini veya değiştirilmiş olarak gösterilmesini istemiyorum. Bunu yapmak için skip-worktree kullanıyorum:

git update-index --skip-worktree path/to/file

Dosyaları listeleyerek ve atlanmış için S ile başlayan satırları kontrol ederek dosyaların atlandığını onaylayabilirsiniz

git ls-files -v | grep ^S

Gelecekte git'in dosyayı yerel olarak yönetmesini istiyorsanız, şunu çalıştırın:

 git update-index --no-skip-worktree path/to/file

Yukarıdaki Mescalito'nun harika bir cevabı vardı, bu da beni doğru yola soktu ama

git update-index --zum-değişmemiş dosya / to / ignore.php

Git ile yapılan bir sözleşmesi vardır: kullanıcı dosyayı değiştirmemeye söz verir ve Git'in çalışma ağacı dosyasının dizine kaydedilenle eşleştiğini varsaymasına izin verir.

Ancak, dosyaların içeriğini değiştiriyorum, bu yüzden benim durumumda --skip-worktree daha iyi bir seçenektir.

Toshiharu Nishina'nın web sitesi, skip-worktree ile varsayım değişmeden arasında mükemmel bir açıklama yaptı: Git ile yerel olarak yönetilen dosyaları yoksay


2

Başka bir olası neden - aynı anda çalışan birkaç git istemcisi örneği . Örneğin "git shell" + "GitHub Desktop" vb.


Bu benim başıma geldi, ana istemci olarak "GitHub Desktop" kullanıyordum ve bazı yeni .gitignore ayarlarını görmezden geliyordu: taahhütten sonra:

  1. Bir şey yapıyorsun.
  2. Sonra, taahhüt: .gitignore ayarlarını yok sayar. Tamamlama .gitignore içinde belirtilen geçici dosyaları içerir.
  3. Git önbelleğini temizle; .gitignore'un UTF8 olup olmadığını kontrol edin; dosyaları kaldır -> taahhüt -> dosyaları geri taşı; 1 taahhüdü atla - hiçbir şey yardımcı olmadı.

Sebep : Visual Studio Code düzenleyicisi, aynı açık havuzla arka planda çalışıyordu. VS Code yerleşik git kontrolü vardır ve bu bazı çakışmalar yapar.

Çözüm : Birden çok, gizli git istemcisini iki kez kontrol edin ve özellikle git önbelleğini temizlerken aynı anda yalnızca bir git istemcisi kullanın.


1

.Gitignore bir uzantı olmadığından emin olun !! .Gitignore.txt olamaz, pencerelerde sadece .gitignore dosyasını adlandırın. ve işe yarayacak.


0

Sadece git 1.7.3.1 ile denedim ve şöyle bir yapı verdim:

repo/.git/
repo/.gitignore
repo/sites/default/settings.php

nerede repoböylece yukarıda belirtilen "kök" (Ben çalışma ağacının kökü çağırır) ve .gitignoresadece içerir sites/default/settings.phpbenim için çalışmalarını görmezden (ve ister önemli değil, .gitignorerepo veya değil eklenir). Bu, repo düzeninize uyuyor mu? Değilse, ne farklılık gösterir?


Evet. Tam olarak sizinkiyle aynı. Ama çalışmıyor. Diğer tüm desenler işe yaradı.
Nick.h

Deponuzda bir şeyler tutmanın ve üzerindeki değişiklikleri görmezden gelmenin çok kötü bir fikir olduğunu düşünüyorum.
Yevgeniy Afanasyev

@YevgeniyAfanasyev, derleme çıktısı, IDE kullanıcı ayarları, araç zinciriniz tarafından oluşturulan diğer tüm geçici dosyalar gibi şeyler hariç…
Chris F Carroll

Sadece proje klasöründe oturan dosyaları değil, depoya bağlı kalmak istedim. Neden depodaki geçici dosyalara ihtiyacınız var?
Yevgeniy Afanasyev

0

Gelecekte herhangi birinin benim yaptığım problemle aynı olması durumunda:

Kullanırsanız

*
!/**/
!*.*

uzantısı olmayan ikili dosyaları kaldırmak için hile, diğer TÜM gitignore satırlarının aşağıda olduğundan emin olun. Git üstten .gitignore'dan okuyacak, bu yüzden gitignore'umda 'test.go' olmasına rağmen, dosyada bir ilkti ve sonra 'imzasız' oldu

!*.*

0

Yukarıda VS Kod terminali en komutları denedim ve ben gibi hataları var:

fatal: pathspec '[dir]/[file]' did not match any files

Projeyi GitHub Desktop'ta açtım ve oradan yoksaydım ve işe yaradı.

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.