.Gitignore'da olmayan dosyaları bulma


12

Projemdeki dosyaları görüntülemek için komut bul:

find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
       -a -not -path './coverage*' -a -not -path './bower_components*' \
       -a -not -name '*~'

.Gitignore'da bulunanları göstermemesi için dosyaları nasıl filtreleyebilirim?

Ben kullandığımı düşündüm:

while read file; do
    grep $file .gitignore > /dev/null && echo $file;
done

ancak .gitignore dosyası glob kalıplarına sahip olabilir (ayrıca dosya .gitignore içindeyse yollarla çalışmaz), Glob olabilecek kalıplara göre dosyaları nasıl filtreleyebilirim?

Yanıtlar:


11

gitgit-check-ignorebir dosyanın hariç tutulup tutulmadığını kontrol etmenizi sağlar .gitignore.

Böylece şunları kullanabilirsiniz:

find . -type f -not -path './node_modules*' \
       -a -not -path '*.git*'               \
       -a -not -path './coverage*'          \
       -a -not -path './bower_components*'  \
       -a -not -name '*~'                   \
       -exec sh -c '
         for f do
           git check-ignore -q "$f" ||
           printf '%s\n' "$f"
         done
       ' find-sh {} +

Her dosya için kontrol yapıldığı için bunun için büyük maliyet ödeyeceğinizi unutmayın.


find-sh {} +Sonunda ne var ?
jcubic


Tamam, ne oldu find-sh?
jcubic

@jcubic, inline-sh komut dosyası için verdiğiniz addır, bu nedenle hata oluşursa, anlamlı bir hata mesajınız olacaktır
cuonglm

@jcubic find /tmp -exec sh -c ': "${non_existed_var:?foo}"' find-sh {} +Örneğin deneyin
cuonglm

9

tam olarak bunu yapmak için bir git komutu var: örn.

my_git_repo % git grep --line-number TODO                                                                                         
desktop/includes/controllers/user_applications.sh:126:  # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52:   TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57:   TODO: check if, at this point, the menurc file exists. i.e. it  was created

Belirttiğiniz gibi, normal grep seçeneklerinin çoğunu temel bir grep yapacaktır, ancak dosyanızdaki .gitdosya veya klasörleri .gitignorearamayacaktır.
Daha fazla ayrıntı için bkz.man git-grep

Altmodüller:

Bu git deposunda başka git depoları varsa, (alt modüllerde olmalıdır) o zaman --recurse-submodulesalt modüllerde de arama yapmak için bayrağı kullanabilirsiniz


Harika, neredeyse çalışır çünkü geçerli dizinde başka git depoları var, bu yüzden "* .git" var.
jcubic

8

Kasanızdaki ve Git tarafından izlenen dosyaları göstermek için şunu kullanın:

$ git ls-files

Bu komutun önbelleğe alınmış dosyaları, izlenmemiş dosyaları, değiştirilmiş dosyaları, yok sayılan dosyaları vb git ls-files --help. Göstermek için bir dizi seçeneği vardır .


Ben de düşünüyorum git ls-filesama izlenmeyen dosyaları göstermek için bir seçenek olduğunu sanmıyorum, hangisini?
cuonglm

2
@cuonglm -o(diğer). Ör.,git ls-files -o -X .gitignore
Kusalananda

Ah evet, ancak dosyanın daha önce izlendiği, ancak içerdiği durumda işleyemiyor .gitignore.
cuonglm

Küçük not: sistemdeki gerçek dosyaları değil, git geçmişine dahil olan dosyaları listeler. Bu, büyük / küçük harfe duyarlı olmayan sistemlerde (örn. Windows paylaşımları) küçük bir fark olabilir. Diyelim ki ./foo.txt yazdım ancak daha sonra ./Foo.txt olarak yeniden adlandırdım. Bazı git istemcileri bu değişikliği tanımayacak ve git ls-files./foo.txt findçıktısını alırken ./Foo.txt
Griddo

2

Bash glob'un gerçekleştirileceği bir dizi kullanabilirsiniz.

Bunun gibi dosyalara sahip olmak:

touch file1 file2 file3 some more file here

Ve böyle bir ignoredosyaya sahip olmak

cat <<EOF >ignore
file*
here
EOF

kullanma

arr=($(cat ignore));declare -p arr

Bunun sonucu:

declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'

Daha sonra bu verileri işlemek için herhangi bir tekniği kullanabilirsiniz.

Şahsen böyle bir şeyi tercih ederim:

awk 'NR==FNR{a[$1];next}(!($1 in a))'  <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore

gitignoreüst kümesidir bashtopak, sen böyle bir şey için özleyeceğim!file*
cuonglm

@cuonglm Ne demek istiyorsun !file*? Yoksayılan dosyada bir glob örüntüsü mü yoksa dosya adı mı?
George Vasiliou

gitignoredosya desenini kabul etmek !file*ile başlayan dosyaları hariç tutmak fileve aynı zamanda çift yıldız**
cuonglm

.gitignoredoğrudan Bash'te uygulanması o kadar kolay olmayabilecek bir dizi özelliğe sahiptir: git-scm.com/docs/gitignore . Sadece basit globlardan oluşan yok
sayılsa

@cuonglm Şunu mu demek istediniz: !as not? Belki genişletilmiş globing bu durumla başa çıkabilir. Doublestar hakkında, bash ile başa çıkabilir shopt -s globstar.
George Vasiliou
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.