.Gitignore tarafından hangi dosyaların yoksayıldığını göstermek için Git komutu


645

Git ile ayaklarımı ıslatıyorum ve aşağıdaki sorunu yaşıyorum:

Proje kaynak ağacım:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

Ben orada derlemek ve daha sonra /src/refsproje onları alır nerede olduğu referansları taşımak satıcı kodunda (şu anda MEF) var .

Benim sorunum .gitignoregörmezden gelmek *.dllve benim set var olmasıdır *.pdb. Ben yapabilirim git add -f bar.dllTamam gözardı dosyanın eklenmesini zorlamak için, sorun ben dosyaları göz ardı edilir olduğunu bulunduğuna bakın listeye anlamaya olamaz.

Eklenmeyi unutmadığımdan emin olmak için yok sayılan dosyaları listelemek istiyorum.

Adam sayfasını okudum ve çalıştıramıyorum git ls-files. Bana öyle geliyor ki git ls-files --exclude-standard -iistediğimi yapmalı. Neyi kaçırıyorum?


12
Bu günlerde git-ls-files yerine 'git ls-files'
kullanamazsınız

7
Ben riyad'ın cevabını doğru olarak kontrol etmeyi yalvarıyorum çünkü bu sadece burada gösterildiği gibi git komutlarını ( hile dahil ) kullanarak bunu yapmanın garantili bir yolu olmadığını itiraf ediyor . Ayrıca, aslında herhangi bir .gitignore dosyasına dikkat etmediği için özetinizdeki "hariç tut" örneğine karşı öneriyorum. Bunu özellikle bu sayfanın en iyi Google yanıtı olduğu için soruyorum. git clean
Alexander Bird

"Neyin işe yaradığının özeti" konusundaki hızlı nokta: "Git ls-files" kılavuz sayfasında "-i" ifadesinin ls çıktısı için hariç tutulan dosyalar içerdiği açıklanmaktadır. 'Yavaş yavaş' okuyana kadar aynı yanlış anlama yaşadım. ;-)
olacak

2
Yanıtlar soruya ilişkin bir düzenlemede değil, bir yanıt gönderisinde bulunmalıdır.
Flimm

Bende var git config --global alias.ls ls-files --exclude-standardve bu da bu sorunun cevabını veriyor git ls -i.
jthill

Yanıtlar:


662

Notlar:


Ayrıca (belirtilen ilginç qwertymk 'ın cevabı ), ayrıca kullanabilirsiniz git check-ignore -v(Unix üzerinde en azından komutu işi değil bir CMD içinde , Windows oturumu)

git check-ignore *
git check-ignore -v *

İkincisi .gitignore, git deponuzda bir dosyanın yoksayılmasını sağlayan gerçek kuralını görüntüler .
Unix'te, " Geçerli dizindeki tüm dosyalara özyinelemeli olarak genişleyen nedir? " Ve bir bash4 + kullanarak:

git check-ignore **/*

(veya bir find -execkomut)

Not: https://stackoverflow.com/users/351947/Rafi B. anlaşılacağı yorumlarda için (riskli) globstar önlemek :

git check-ignore -v $(find . -type f -print)

Ancak dosyaları .git/alt klasörden hariç tuttuğunuzdan emin olun .


Orijinal cevap 42009)

git ls-files -i

kaynak kodu göstermesi dışında çalışması gerekir :

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given ?

-iAslında bir şey listelemek için bir parametreye daha ihtiyaç duyduğu ortaya çıkıyor :

Deneyin:

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(ancak bu yalnızca önbelleğe alınmış (yoksayılmamış) nesnenizi bir filtreyle listeleyecektir , dolayısıyla tam olarak istediğiniz şey bu değildir)


Misal:

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

Aslında, 'gitignore' dosyamda ('hariç tut' olarak adlandırılır), size yardımcı olabilecek bir komut satırı buluyorum:

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

Yani....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

hile yapmalı.

Bahsedildiği gibi ls-files adam sayfasında , --otherssigara önbelleğe olmayan kararlı, normalde-gözardı dosyaları göstermek amacıyla, önemli bir parçasıdır.

--exclude_standardyalnızca bir kısayol değil, tüm standart "yok sayılan kalıplar" ayarlarını eklemenin bir yoludur .

exclude-standard
Her dizine standart git exclusions:, .git/info/excludeve öğelerini ekleyin ..gitignoreuser's global exclusion file


@VocC, bu testleri anladığım kadarıyla , en üstte önerdiğiniz cevabın büyük kusurları olabilir. Bu yüzden riyadın cevabını normalde tavsiye ederim .
Alexander Bird

2
Git v2.13.2 Sürümünden beri: git status --ignoredizlenmemiş dosyaları da gösteriyor: github.com/git/git/blob/master/Documentation/RelNotes/…
Pau

1
wow, git check-ignore -v *config'in uygulandığı yeri gösterdiği için harika çalışıyor. Teşekkür ederim.
Hoang Tran

@MikeD * / work yapmak için (ya da aslında ** yapabilirsiniz) shopt -s globstarbundan sonra ayarlanması için globstar'a ihtiyacınız vardır .
Veda

Globstar'ı etkinleştirmeden:git check-ignore -v $(find . -type f -print)
rafi

483

Bunu yapmanın çok daha basit bir yolu var (git 1.7.6+):

git status --ignored

Bkz. Git-status komutunun .gitignore dosyalarının etkilerini yoksaymasını söylemenin bir yolu var mı?


3
Git'in hangi sürümünü kullanıyorsunuz? Benimki (1.7.0.4) diyor error: unknown option 'ignored'. -sBağlantılı gönderide önerildiği gibi eklemek bile işe yaramadı.
Alexander Bird

3
Sürümüm 1.7.6. Başka bir sürüm 1.7.5.1 gerektirir -s. Desteklenip desteklenmediğini git status -hgörmeyi deneyebilirsiniz--ignored
Penghe Geng

1
Sanırım henüz 1.7.0.4'te desteklenmiyor. Diğer bilgisayarımda 1.7.9 var ve --ignored bayrağı var
Alexander Bird

4
Bu sayfadaki her çözümü denedim. Bu en iyisi. Hem dosyaları hem de dizinleri gösterir. Bu soru ilk başta sorulduğunda muhtemelen bu özellik kullanılamıyordu. (Bu arada, tüm çözümler yepyeni bir "git init" ile en azından değişiklikleri sahneleyene kadar düzgün çalışmaz.)
wisbucky

12
Bu kesinlikle kabul edilen cevaptan çok daha iyi. Ayrıca git clean -ndXçözümden çok daha güvenlidir , çünkü bayrakların yanlışlıkla unutulduğu nadir durum, izlenmeyen dosyalar silindiği için depo üzerinde geri alınamaz bir etkiye sahip olacaktır. Bu yüzden tehlikeli. Aksine git status --ignored, yanlış yazıldığında bile ve her zaman güvenlidir ve hatırlanması doğaldır.
Ioannis Filippidis

400

Oldukça temiz olan başka bir seçenek (Pun yok.):

git clean -ndX

Açıklama:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.

Not: Bu çözüm, önceden kaldırılmış yok sayılan dosyaları göstermez.


Şık ... ancak orijinal soru sordum nedeni ben orada olması gerekiyordu satıcı dosyaları (* .dll) olduğundan emin olabilir böylece ... onları silmek istenen sonuç olmazdı. ANCAK: bu benim strateji * .dll yoksaymak benim çıkış klasörü (ama benim satıcı klasörleri değil) görmezden gelen değişti bilmek iyi. Bu make cleanbir yapı sunucusu için iyi bir alternatif ve çok yararlı olacaktır.
Andrew Burns

2
Git 1.7.0.4 sürümünü kullanıyorum ve iki komut ('git ls-files -o -i --exclude-standard', 'git clean -dXn') eşdeğer değil. Birincisi bana 4 dosya, ikincisi sadece ikisini gösteriyor. (.gitignore ~, index.php ~, sql / create_users.sql ~, www / index.php ~) (.gitignore ~ ​​'u kaldırır, index.php ~' yi kaldırır). Burada bir şey mi özlüyorum?
Cesar

@VonC, tatlı! Teşekkürler! @ Sezar, emin değilim. Çok aşina değilim git ls-files -o -i --exclude-standard. git clean -dXnher zaman istediğim şeydi, ancak zaten kaldırılmış olan yok sayılan dosyaları göstermiyor. git ls-files -o -i --exclude-standardolabilir. Farkı yaratan şey bu olabilir.
ma11hew28

3
Küçük bir şey - nyanlışlıkla bu şekilde silmenin ilk, daha az şansını yazmak iyi bir fikir olabilir ; git clean -ndX
Tobias Cohen

1
@TobiasCohen güzel! Cevabınızı önerinizle güncelledim. Bu daha guvenli. Ancak, dışarıda bırakırsanız nGit varsayılan olarak kullanılır fatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to clean. Yine de oldukça güvenli, ancak nilk yazmak daha da güvenli! :)
ma11hew28

39

Genel olarak doğru olsa da, çözümünüz her koşulda çalışmaz. Bunun gibi bir repo dir varsayalım:

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

ve böyle bir .gitignore:

# cat .gitignore
doc
tmp/*

Bu, docdizini ve aşağıdaki tüm dosyaları yok sayar tmp. Git beklendiği gibi çalışıyor, ancak yok sayılan dosyaları listelemek için verilen komut çalışmıyor. Git'in söylediklerine bir bakalım:

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

Girişte doceksik olduğuna dikkat edin . Şunlarla alabilirsiniz:

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

Ek --directoryseçeneğe dikkat edin .

Bildiğim kadarıyla, yok sayılan dosyaları bir kerede listelemek için tek bir komut yok. Ama neden tmp/dir0hiç görünmediğini bilmiyorum .


2
Bu beni istediğimi elde etti, diğerleri ise (benim özel durumum için) ... teşekkürler! İki komutu çalıştırmak sinir bozucudur, ancak yok sayılan bir dizinde, --directory seçeneği en azından beni bulur ve dosyaları bulmak için bir find komutuna bağlayabilirim. Teşekkürler!
Lindes

Bu bir kerede hepsini yapar ve dizinleri genişletir:(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
Dee Newcum

17

Git artık bu işlevselliğe yerleşik olarak sahiptir

git check-ignore *

Tabii ki bir şeye topak gibi değiştirebilir **/*.dllsizin durumunuzda

Git Referansı


7
git check-ignore **/*dizinlerine dosya eklemek için
mzimmer

bu yalnızca en üst düzey disiplinleri listeler.
Radon8472

13

Kullanmak yeterli olmalı

git ls-files --others -i --exclude-standard

kapladığı her şeyi kapsar

git ls-files --others -i --exclude-from=.git/info/exclude

bu nedenle ikincisi gereksizdir.


~/.gitconfigDosyanıza bir takma ad ekleyerek bunu kolaylaştırabilirsiniz :

git config --global alias.ignored "ls-files --others -i --exclude-standard"

Şimdi sadece git ignoredlisteyi görmek için yazabilirsiniz . Hatırlaması çok daha kolay ve yazması daha hızlı.

Jason Geng'in çözümünün daha özlü görüntüsünü tercih ederseniz, bunun için bir takma ad ekleyebilirsiniz:

git config --global alias.ignored "status --ignored -s"

Ancak, daha ayrıntılı çıktı, yok sayılan her bir pamuk toplama dosyasını listelediğinden .gitignore dosyalarınızdaki sorunları gidermek için daha yararlıdır. grepGöz ardı edilmesini beklediğiniz bir dosyanın orada olup olmadığını veya yoksaymak istemediğiniz bir dosyanın orada olup olmadığını görmek için sonuçları normalde kullanırsınız .

git ignored | grep some-file-that-isnt-being-ignored-properly

Ardından, sadece kısa bir ekran görmek istediğinizde, hatırlamak ve yazmak yeterince kolaydır

git status --ignored

( -sNormalde kapalı bırakılabilir.)


Bu benim için hiç işe yaramadı, çünkü bu dosyaları el ile listelemeniz gerekiyor. git status --ignoredDebian sid üzerinde çalışıyor ama çok yeni olabilir… ama görünüşe göre popüler talep nedeniyle eklendi ;-)
mirabilos

1
"Debian sid üzerinde çalışır" ile kastediyorum "varsayılan Debian sid üzerinde yüklü Git sürümü ile çalışır"? Dağıtımınızda yer alan yardımcı programların sürümleriyle kendinizi rehin tutmanıza izin vermekten gerçekten kaçınmalısınız. Bunları dağıtımın kendisinden bağımsız olarak yükseltebilirsiniz.
iconoclast

12

Git'in çoklu gitignore kaynaklarında (GNU kullanıyorsanız find) herhangi bir yerde bulunan kalıplarla eşleşen çalışma ağacındaki dosyaların tam listesini aşağıda bulabilirsiniz :

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

Deponun geçerli dalındaki tüm dosyaları kontrol eder (yerel olarak silmediyseniz).

Ve belirli gitignore kaynak hatlarını da tanımlar.

Git, bazı dosyalardaki gitignore desenleriyle eşleşen değişiklikleri izlemeye devam eder, çünkü bu dosyalar zaten eklenmiştir. Yararlı bir şekilde, yukarıdaki komut bu dosyaları da görüntüler.

Negatif gitignore kalıpları da eşleştirilir. Bununla birlikte, bunlar girişte kolayca ayırt edilebilir, çünkü ile başlarlar !.

Windows kullanıyorsanız, Git Bash GNU içerir find(açıklandığı gibi find --version).

Liste uzunsa (ve varsa rev), bunları uzantıyla (biraz) da görüntüleyebilirsiniz:

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

Daha fazla ayrıntı için bkz man find, man git-check-ignore, man rev, ve man sort.

Tüm bu yaklaşımın amacı Git'in (yazılımın) hızla değişmesi ve oldukça karmaşık olmasıdır. Buna karşılık, GNU en findolduğu son derece (özellikleri burada kullanılan içinde, en azından) kararlı. Dolayısıyla, Git hakkındaki derinlemesine bilgilerini göstererek rekabetçi olmak isteyen herkes soruyu farklı bir şekilde cevaplayacaktır.

En iyi cevap nedir? Bu cevap, modülerlik (bilgi izolasyonu) yoluyla istikrar ve basitlik hedefine ulaşmak için Git bilgisine olan güvenini kasten en aza indirir ve uzun süre dayanacak şekilde tasarlanmıştır .


Çok teşekkürler! Yeni kaynak dosyalarımın bazılarının zaman zaman taahhütlerimde neden eksik olduğunu anlamaya çalışıyordum. Bir desen vardı: bin *, sadece bin ile başlayan dosyaların / dizinlerin adlarıyla eşleşeceğini düşündüm, bunun yerine bir dosyanın / dizinin tam yolunda bin içeren bir şeyle eşleştiğini düşünüyorum! Sanırım benim sorunum .gitignore'daki desen eşleşmesinin kesin anlambiliminin yanlış anlaşılmasından kaynaklanıyor. 2 satırlı komut dosyanız bu hatayı bulmama yardımcı oldu!
Nicolas Rouquette

1

(diğer cevapları genişletmek)

Not, çalışma ağacınızda değil git check-ignore, kararlı .gitignoreolanı kullanır ! Git geçmişinizi kirletmeden oynamak için, özgürce düzenlemeyi deneyebilir ve ardından a ile işlem yapabilirsiniz git commit --amend.

Bu sorun, esas olarak sorunun geçici bir çözümüne ihtiyacınız varsa, git dizinleri izlemezse oluşur. Şunu girin .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keepdosyasında sıfır uzunluklu bir dosya olmalıdır dirtokeep.

Sonuç o olacak her şey de dirtokeep, göz ardı edilecektir hariç dirtokeep/.keep Ayrıca neden olacaktır, dirtokeepdizin klon / çıkış üzerine inşa edilecektir.


0

Birkaç yok sayılan dizin olduğunu varsayarsak, neden hangi dosyaların ekleneceğini söyleyen "git status node / logs /" kullanmıyorsunuz? Dizinde, örneğin durum çıktısının bir parçası olmayan bir metin dosyası var:

Şube yöneticisi hakkında
Şubeniz 'orijin / master' ile güncel.
İzlenmeyen dosyalar:
(taahhüt edilecekleri eklemek için "git add ..." kullanın)

    node/logs/.gitignore 

.gitignore:

*

! .gitignore

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.