Apa perbedaan antara menambahkan bin
, bin/
, bin/*
dan bin/**
dalam file Gitignore saya? Saya telah menggunakan bin/
, tetapi melihat file .gitignore lainnya (dalam file gerhana bintang ganda dan bintang tunggal bahkan digunakan bersamaan seperti ini: ada apa dengan itu?) Saya melihat bahwa dua pola pertama juga banyak digunakan. Bisakah seseorang menjelaskan perbedaan antara ketiganya?tmp/**/*
89
**
: stackoverflow.com/questions/1470572/…Jawaban:
bin
cocok dengan file atau direktori apa pun yang bernama 'bin'.bin/
cocok dengan semua direktori bernama 'bin', yang artinya semua isinya karena Git tidak melacak direktori saja.bin/*
cocok dengan semua file dan direktori secara langsung di sembarangbin/
. Hal ini mencegah Git secara otomatis menemukan file apa pun dalam subdirektorinya, tetapi jika, misalnyabin/foo
subdirektori dibuat, aturan ini tidak akan cocokfoo
dengan kontennya.bin/**
cocok dengan semua file dan direktori dalambin/
direktori manapun dan semua subdirektorinya.Kata "any" sangat penting di sini karena aturan tidak berhubungan dengan root repositori dan berlaku di mana saja di pohon sistem file. Anda harus memulai aturan dengan
/
(atau!/
untuk membatalkan pengabaian) yang berarti root repositori, bukan root sistem, untuk mencocokkan hanya yang dimaksudkan.PERINGATAN: Anda harus tidak pernah menggunakan aturan seperti
dir/*
,/dir/**
, dll saja kecuali Anda juga un-mengabaikan sesuatu yang ada di dalam direktori tersebut . Hilangkan tanda bintang atau Anda dapat kehilangan banyak data secara permanen dari pemanggilan tertentugit gc
,git stash
dan banyak lagi.Saya tidak begitu tahu apa
tmp/**/*
yang harus saya lakukan. Awalnya saya mengira ini dapat digunakan untuk mencocokkan file di sub-direktoritmp/
tetapi bukan file yang langsung ada di dalamnyatmp/
. Tetapi tes sederhana tampaknya menunjukkan bahwa ini mengabaikan semua file ditmp/
.sumber
bin/
danbin/**
?bin/
akan mengabaikan direktori bin, sedangkanbin/**
akan menyertakan direktori bin tetapi tidak ada isinyabin/
akan mengabaikan direktori itu sendiri (termasuk semua sub-direktori dan file), sedangkanbin/**
akan mengabaikan semua file dalam direktori bin dan sub-direktorinya, tetapi tidak pada direktori bin itu sendiri. Apakah itu akurat atau tidak, saya tidak yakin.bin/** \n !bin/*
(karena saya tidak dapat melihat cara memaksabin
cocok baik sebuah file bernamabin
dan isi daribin
folder. Ketiga,bin/*
cocok dengan semua file di subdirektorinya. Apakah kalian pernah menguji ini?bin
danbin/
hanya berbeda dalam hal ini yang terakhir hanya akan cocok dengan direktori.bin/**/*
sama denganbin/**
(tampaknya sejak 1.8.2, menurut jawaban @ VonC).Yang rumit, bahwa saya hanya menghabiskan satu jam atau lebih merobek rambut saya, adalah itu
bin/
danbin/**
tidak persis sama! Karena sebelumnya mengabaikan direktori secara keseluruhan, dan yang terakhir mengabaikan setiap file di dalamnya, dan git di hampir semua kasus tidak peduli dengan direktori, biasanya tidak ada perbedaan. Namun, jika Anda mencoba menggunakan!
untuk tidak mengabaikan sub jalur, Anda akan mendapati bahwa git (ahem) mengabaikannya jika Anda mengabaikan direktori induk! (sekali lagi, bukan isi direktori)Ini paling jelas dengan contoh, jadi untuk repositori yang baru diinit, atur begitu:
Ada file yang tidak terlacak berikut:
Tetapi Anda dapat melihat file-file berikut tidak diabaikan:
Dan jika Anda mencoba menambahkan, Anda mendapatkan:
Saya menganggap perilaku ini sebagai bug. (Ini semua aktif
git version 1.8.4.msysgit.0
)sumber
dir/
dandir/**
kembali. un-ignoring with!
terjadi karena "Tidak mungkin untuk menyertakan kembali file jika direktori induk dari file tersebut dikecualikan" [sumber ]. Membingungkan, tetapi dilakukan karena alasan kinerja. Lihat pertanyaan SO terkait .Perhatikan bahwa, secara tegas, git tidak melacak direktori, hanya file. Oleh karena itu, tidak mungkin untuk menambahkan direktori, hanya isinya .
.gitignore
Namun dalam konteksnya , git berpura-pura memahami direktori hanya untuk alasan ituApa artinya ini untuk pola pengecualian? Mari kita bahas secara detail:
bin
Ini mengabaikan
bin
.bin
Anda dapat memasukkan
bin
file dan folder yang diabaikan ke dalam daftar putih dengan menambahkan!
entri berikutnya , tetapi Anda tidak dapat memasukkan konten folder bernamabin
bin/
Sama seperti di atas, hanya saja tidak cocok dengan file bernama
bin
. Menambahkan sebuah trailing/
memberitahu git untuk mencocokkan direktori saja.bin/*
Ini mengabaikan
bin
bin
bin/**
Ini mengabaikan
bin
bin
sumber
Saya baru saja membuat repo baru dan mencoba beberapa hal. Ini hasil saya:
HASIL BARU
git versi 2.10.1.windows.1
bin
direktori sedalam beberapa lapisanbin.txt
Test.txt
bin/a/b/bin.txt
bin/a/b/Test.txt
bin/a/bin/bin.txt
bin/a/bin/Test.txt
bin/a/bin.txt
bin/a/Test.txt
bin/bin.txt
bin/Test.txt
bin
ke gitignore: Hasilbin
direktori (dan lebih dalam) sekarang diabaikanbin
kebin/
di gitignore: Hasilbin/
kebin/*
bin/*
kebin/**
bin/**
kebin/**/
bin/bin.txt
danbin/Test.txt
tidak lagi diabaikanbin/**/
kebin/**/*
bin/bin.txt
danbin/Test.txt
kembali diabaikanHASIL LAMA
versi git: 2.7.0.windows.1
bin
direktori sedalam beberapa lapisanbin/a/b/Test.txt
bin/a/bin/Test.txt
bin/a/Test.txt
bin/Test.txt
bin
ke gitignore: Hasilbin
direktori (dan lebih dalam) sekarang diabaikanbin
kebin/
di gitignore: Hasilbin
direktori (dan lebih dalam) masih diabaikan (tidak ada perubahan)bin/
kebin/*
bin
direktori (dan lebih dalam) masih diabaikan (tidak ada perubahan)bin/*
kebin/**
bin
direktori (dan lebih dalam) masih diabaikan (tidak ada perubahan)bin/**
kebin/**/
bin/Test.txt
tidak lagi diabaikanbin/**/
kebin/**/*
bin
direktori (dan lebih dalam) akan diabaikan lagisumber
Perhatikan bahwa '
**
', jika digabungkan dengan sub-direktori (**/bar
), pasti sudah berubah dari perilaku defaultnya, karena catatan rilis untuk git1.8.2 sekarang menyebutkan:Aturan yang harus diingat (dan yang membantu memahami perbedaan maksud di balik sintaks tersebut) adalah:
Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan.
Biasanya, jika Anda ingin mengecualikan file dari subfolder dari folder abaikan f, Anda akan melakukan:
Itu adalah:
f/
, folderf/
akan diabaikan dan aturan di bawahf
ini tidak akan menjadi masalah.f/**
mencapai hal yang samaf/
, tetapi abaikan semua sub-elemen (file dan subfolder).Yang memberikan Anda kesempatan untuk daftar putih (mengecualikan dari gitignore) subfolder:
!f/**/
.f
subfolder tidak diabaikan, Anda bisa menambahkan aturan untuk mengecualikan file (!f/a/sub/folder/someFile.txt
)sumber
Ada perbedaan lain antara
bin/*
danbin/
.bin/
cocokfoo/bin/test.txt
(seperti yang diharapkan), tetapibin/*
tidak, yang tampaknya aneh, tetapi ini didokumentasikan: https://git-scm.com/docs/gitignoreAlasannya tampaknya karena aturan ini:
Jadi jika polanya diakhiri dengan garis miring, garis miring tersebut akan dihapus dan diperlakukan sebagai pola shell glob, dalam hal ini
bin
cocokfoo/bin/test.txt
. Jika diakhiri dengan/*
, garis miring tidak dihapus dan diteruskan ke fnmatch, yang tidak cocok di subdirektori.Namun, hal yang sama tidak berlaku untuk
foo/bin/
danfoo/bin/*
, karena bahkan setelah menghapus garis miring darifoo/bin/
, itu masih berisi garis miring, jadi itu diperlakukan sebagai pola fnmatch, bukan bola. Yaitu tidak akan cocokbar/foo/bin/test.txt
sumber