Hangi gitignore kuralının dosyamı yok saydığını açıkla


310

Neden bazı dosyaların git tarafından göz ardı edildiğini görmenin herhangi bir yolu var mı (yani hangi kural .gitignore Dosyadaki dosyanın yok sayılmasına neden oluyor)?

Yüzlerce klasör ve onlarca .gitignoredosya ile bu (veya çok daha karmaşık bir senaryo var) düşünün :

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

git add folder/subfolder/file.txtGit çalıştırırsanız , göz ardı ediliyor şikayetçi olabilir:

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

.gitignoreBu dosyanın göz ardı edilme kuralının hangisinin mümkün olduğunu bilmenin ve ayrıca kuralı göstermenin herhangi bir yolu var mı ? Sevmek:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

Ya da sadece:

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

4
Not: git check-ignoreyakında (git1.8.5 / 1.9) bir --no-indexseçenek sunacaktır . Aşağıdaki cevabımı
VonC

Not: GIT_TRACE_EXCLUDE=1 git statusyakında .gitignorekurallarda hata ayıklamanın ek bir yolu olacaktır . Bkz aşağıda benim Düzenlenen cevabı
VonC

İlgili blog yazısı: danielcompton.net/2016/04/21/… .
krlmlr

Yanıtlar:


643
git check-ignore -v filename

Daha fazla bilgi için kılavuz sayfasına bakınız.

Orijinal cevap aşağıdaki gibidir:

git şu anda böyle bir şey sağlamıyor. Ancak sorunuzu gördükten sonra biraz googling yaptım ve 2009'da bu özelliğin istendiğini ve kısmen uygulandığını gördüm . Konuyu okuduktan sonra, düzgün bir şekilde yapmak için çok fazla iş olmayacağını fark ettim, bu yüzden bir yama üzerinde çalışmaya başladım ve ertesi gün veya iki gün içinde bitirmeyi umuyorum. Bu cevabı hazır olduğunda güncelleyeceğim.

GÜNCELLEME: Vay canına, bu beklediğimden çok daha zordu. Dışlama işleminin iç kısımları gitoldukça gizlidir. Neyse, burada bir adeta kaydedilmesini bitmiş serisi bugünün memba için geçerli masterdalı. Test takımı% 99 tamamlandı, ancak--stdin seçeneğin . Umarım bu haftasonunu yönetirim ve yamalarımı git posta listesine gönderirim.

Sadece klon - Bu arada, ben kesinlikle bunu yapmak mümkün değil kimseden test hoş geldiniz ediyorum benim gitçatal göz atın check-ignoredalı ve normal olarak derlemek.

GÜNCELLEME 2: Tamam! Son sürüm yukarıdaki gibi github üzerinde ve ben akran incelemesi için yama serisi git posta listesine gönderdik . Ne düşündüklerini görelim ...

GÜNCELLEME 3: Birkaç ay daha hackleme / yama incelemeleri / tartışmalar / beklemeden sonra, bu özelliğin git'in masterdalına ulaştığını ve bir sonraki sürümde sunulacağını söyleyebildiğim için çok mutluyum (1.8.2, 8'inci bekleniyor) Mart 2013). İşte check-ignorekılavuz sayfası . Vay be, beklediğimden çok daha fazla işti!

GÜNCELLEME 4: Bu cevabın nasıl geliştiği ve özelliğin nasıl uygulandığı ile ilgili tüm hikayeyle ilgileniyorsanız, GitMinutes podcast'in 32. bölümüne bakın .


2
1.8.2 kullanıyorum ve git check-ignorehiçbir şey yapmıyorum.
zakdances

3
@yourfriendzak Şüphesiz bir gölge olmadan, 1.8.2'de git check-ignorevar ve çalışıyor. Davranış beklediğiniz gibi değilse, manuel sayfayı okumanızı (tekrar) öneririm ve hala değilse, lütfen git posta listesine uygun bir hata raporu gönderin. Sadece bir şey yapmadığını söylemek çok yardımcı olmaz. Ben muhtemelen var olmayan bir ihmal dosya üzerinde çalıştırmak ve (muhtemelen desteği eklemek rağmen yanlış bazı çıkışını bekliyoruz bekliyoruz --show-unmatchediçin --verbosegelecekte çıkış modu).
Adam Spires

1
@AdamSpiers haklısın. Komutu çalıştırdığımda hiçbir şeyin basılmadığını belirtmeliydim. Hata mesajı yok, başarı mesajı yok, bilgi yok. Bir sonraki boş istem beliriyor. Bazı durumlarda "hiçbir çıktı" beklenen davranış olduğunu varsaymak doğru mudur?
zakdances

1
@AdamSpiers bunun için çok teşekkür ederim! 3 günlük bir araştırmadan sonra, .gitignore_global'daki global olarak yok sayılan bir dosya nedeniyle bir kırılma derlemesinin nedenini izlememe yardımcı oldunuz! Bunun bir şey olduğunu bile bilmiyordum!
BenBtg

3
Bir Yığın Taşması geliştiricisinin bir geliştirici özelliğini uygulamak için çok fazla değişiklik yapması her gün değildir. Vay canına ve saygı.
user3613932

18

Git 2.8'i güncelleyin (Mart 2016):

GIT_TRACE_EXCLUDE=1 git status

Bkz. " Dosyayı doğrulamanın bir yolu.gitignore "

Bu, git check-ignore -vaşağıda açıklananları tamamlayıcı niteliktedir .


Orijinal cevap: Eylül 2013 (git 1.8.2, sonra 1.8.5+):

git check-ignoregit 1.8.5 / 1.9 (4. Çeyrek 2013) 'te tekrar iyileşti :

" git check-ignore" , yoksay / hariç tut mekanizmasının önceden izlenen yollarda etkili olmaması nedeniyle " git add" ve " git status" ile aynı kuralı izler .
" --no-index" Seçeneğiyle, yok sayılması gereken yolların dizine yanlışlıkla eklenmiş olduğunu teşhis etmek için kullanılabilir .

Bkz 8231fa6 taahhüt gelen https://github.com/flashydave :

check-ignoreşu anda .gitignorekuralların izlenmeyen yolları nasıl ele alacağını göstermektedir . İzlenen yollar yararlı çıktı oluşturmaz.
Bu, bir yolun dizinden ilk olarak kaldırılmadığı sürece bir yolun neden beklenmedik bir şekilde izlendiğinin hata ayıklamasını önler git rm --cached <path>.

Seçenek --no-index, komutta dizinde bulunan yolun denetimini atlamasını söyler ve böylece izlenen yolların da denetlenmesine izin verir.

Bu davranış özelliklerinden sapırken git addve git statuskullanım durumunun herhangi bir kullanıcı karışıklığına neden olması olası değildir.

Doğru komutun alınmasını sağlamak için bu seçeneği standart yoksaymalara göre denetlemek üzere test komut dosyaları artırılır.


--no-index::

Kontrolleri yaparken endekse bakmayın.
Bu kullanılabilir:

  • bir yolun neden izlendiğini git add .ve kullanıcı tarafından beklendiği gibi kurallar tarafından göz ardı edilmediğini hata ayıklamak için veya
  • önceden eklenen bir yolla eşleşmek için olumsuzlama da dahil olmak üzere desenler geliştirirken git add -f.

4

Adam sayfasında hiçbir şey bulamıyorum ama burada git-add'ed olup olmadığını görmek için her bir üst dizinde dosyanızı kontrol edecek hızlı ve kirli bir komut dosyası. Sorunlu dosyayı içeren dizinde çalıştırın:

test-add.sh STOP_DIR FILENAME

nerede STOP_DIRGit projesinin en üst düzeydeki dizini ve FILENAMEsorun dosya adı (bir yol olmadan) 'dir. Hiyerarşinin her seviyesinde aynı adda boş bir dosya oluşturur (yoksa) ve git add -neklenip eklenemeyeceğini (kendisinden sonra temizler) görmeye çalışır . Bunun gibi bir çıktı verir:

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

Senaryo:

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 

1

Kullanarak ana cevaba eklemek için git check-ignore -v filename(teşekkürler BTW) .gitignore dosyamın bir joker karakterden sonra bir satırsonu olduğu için her şeyi engellediğini buldum, bu yüzden:

* .sublime-project

Örnek olarak. Yeni satýrý kaldým ve voila! Düzeltildi.

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.