gitignore semua file ekstensi dalam direktori

Jawaban:

123

Pernah mencobanya, tapi git help ignoremenunjukkan bahwa jika Anda menaruh .gitignoredengan *.jsdi /public/static, ia akan melakukan apa yang Anda inginkan.

Catatan: pastikan juga memeriksa jawaban Joeys di bawah ini: jika Anda ingin mengabaikan file dalam subdirektori tertentu, maka .gitignore lokal adalah solusi yang tepat (lokalitas baik). Namun jika Anda membutuhkan pola yang sama untuk diterapkan ke seluruh repo Anda, maka solusi ** lebih baik.

ptyx
sumber
19
Itu tidak perlu solusi terbaik. Orang yang berpotensi perlu menggali melalui berbagai file .gitignore untuk menemukan mengapa file mereka diabaikan. Beberapa lebih suka memiliki semua informasi ini dalam satu file .gitignore disimpan di direktori root repo.
haren
1
@haren itu bukan satu-satunya solusi - jawaban Joey tentu juga valid. Pilih apa pun yang paling cocok untuk Anda. Saya berpendapat bahwa mengabaikan aturan lokal ke direktori harus di direktori itu, dan aturan global harus global. (Juga, jawaban ini kuno dan saya kira ** tidak didukung saat itu).
ptyx
211

Akan terlihat bahwa **sintaks didukung oleh gitversi 1.8.2.1sesuai dengan dokumentasi .

Dua tanda bintang berturut-turut (" **") dalam pola yang cocok dengan pathname penuh mungkin memiliki arti khusus:

  • Pimpinan " **" yang diikuti dengan garis miring berarti cocok di semua direktori. Misalnya, " **/foo" cocok dengan file atau direktori " foo" di mana saja, sama dengan pola " foo". " **/foo/bar" cocok dengan file atau direktori " bar" di mana saja yang langsung di bawah direktori " foo".

  • Trailing " /**" cocok dengan semua yang ada di dalamnya. Sebagai contoh, " abc/**" cocok dengan semua file di dalam direktori " abc", relatif terhadap lokasi .gitignorefile, dengan kedalaman tak terbatas.

  • Garis miring diikuti oleh dua tanda bintang berturut-turut kemudian garis miring cocok dengan nol atau lebih direktori. Misalnya, " a/**/b" cocok " a/b", " a/x/b", " a/x/y/b" dan seterusnya.

  • Tanda bintang berturut-turut dianggap tidak valid.

joeyhoer
sumber
1
apa perbedaan antara xxx/**dan xxx/?
thuzhf
9
xxx/**menargetkan semua file dan direktori di dalamnya xxxsedangkan xxx/menargetkan xxxdirektori secara langsung. Ini benar-benar hanya masalah ketika meniadakan pola dengan !"Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan.", Jadi menggunakan xxx/*atau xxx/**akan diperlukan dalam kasus itu.
joeyhoer
4
Semua file dengan akhiran .meta harus diabaikan oleh git. Bagaimana cara kerjanya? **.js?
Hitam
"Tanda bintang berturut-turut lainnya dianggap tidak valid." jumlah semuanya
imrok
68

UPDATE: Lihatlah jawaban @ Joey : Git sekarang mendukung **sintaksis dalam pola. Kedua pendekatan harus bekerja dengan baik.


The gitignore (5) halaman manual negara:

Pola membaca dari file .gitignore di direktori yang sama dengan path, atau di direktori induk apa pun, dengan pola di file level yang lebih tinggi (hingga tingkat tertinggi pohon kerja) ditimpa oleh mereka yang berada di file level yang lebih rendah ke direktori. berisi file.

Artinya adalah bahwa pola dalam .gitignorefile di direktori tertentu dari repo Anda akan memengaruhi direktori itu dan semua subdirektori .

Pola yang Anda berikan

/public/static/**/*.js

tidak benar, pertama karena (seperti yang Anda catat dengan benar) **sintaks tidak digunakan oleh Git. Juga, /jangkar terkemuka yang berpola ke awal pathname. (Jadi, /public/static/*.jsakan cocok /public/static/foo.jstetapi tidak /public/static/foo/bar.js .) Menghapus yang memimpin /tidak akan berhasil, mencocokkan jalur seperti public/static/foo.jsdan foo/public/static/bar.js. EDIT: Hanya menghapus garis miring tidak akan berhasil juga - karena polanya masih mengandung garis miring, itu diperlakukan oleh Git sebagai bola shell polos, non-rekursif (terima kasih @ Joey Hoer karena telah menunjukkan ini).

Seperti yang disarankan @ptyx, apa yang perlu Anda lakukan adalah membuat file <repo>/public/static/.gitignoredan memasukkan hanya pola ini:

*.js

Tidak ada yang memimpin /, sehingga akan cocok di bagian mana pun dari lintasan, dan pola itu hanya akan diterapkan ke file dalam /public/staticdirektori dan subdirektori.

Adam Sharp
sumber
2
Ini tidak sepenuhnya benar - khususnya bagian "Menghapus pimpinan /tidak akan berhasil, dengan mencocokkan jalur seperti public/static/foo.jsdan foo/public/static/bar.js." itu salah. Mengutip dokumentasi "Jika pola tidak mengandung garis miring /, Git memperlakukannya sebagai pola gumpalan shell dan memeriksa kecocokan dengan pathname relatif terhadap lokasi file .gitignore (relatif terhadap tingkat tertinggi dari pohon kerja jika bukan dari file .gitignore). " foo/public/static/bar.jstidak akan cocok karena polanya mengandung a /.
joeyhoer
@ JoeyHoer terima kasih atas tipnya, saya telah memperbarui jawaban saya sesuai.
Adam Sharp
9

Untuk mengabaikan file yang tidak dilacak, cukup buka .git / info / exclude. Kecualikan adalah file dengan daftar ekstensi atau file yang diabaikan.

Thiago Ramos
sumber
2
Ini tidak akan dibawa ke klon repositori lain seperti .gitignore akan (setelah dilakukan, tentu saja).
jpmc26
3

Saya percaya solusi paling sederhana adalah menggunakan find. Saya tidak suka memiliki banyak .gitignorenongkrong di sub-direktori dan saya lebih suka mengelola tingkat atas yang unik .gitignore. Untuk melakukannya, Anda cukup menambahkan file yang ditemukan ke file Anda .gitignore. Andaikan itu /public/static/adalah proyek / git Anda di rumah, saya akan menggunakan sesuatu seperti:

find . -type f -name *.js | cut -c 3- >> .gitignore

Saya menemukan bahwa memotong ./di awal sering diperlukan agar git memahami file mana yang harus dihindari. Oleh karena itu cut -c 3-.

Garini
sumber