Apakah banyak `.gitignore's dahi disukai?

239

Kecuali jika repo terdiri dari beberapa proyek independen, tampaknya akan lebih mudah untuk hanya memiliki satu .gitignorefile di root repo daripada berbagai yang ada di seluruh. Apakah ada praktik terbaik standar pada analisis ini atau online ketika satu pendekatan lebih baik dari yang lain?

Conley Owens
sumber

Jawaban:

254

Saya dapat memikirkan setidaknya dua situasi di mana Anda ingin memiliki banyak .gitignorefile di direktori (sub) yang berbeda.

  • Direktori yang berbeda memiliki jenis file yang berbeda untuk diabaikan. Misalnya .gitignoredi direktori teratas proyek Anda mengabaikan program yang dibuat, sementara Documentation/.gitignoremengabaikan dokumentasi yang dihasilkan.

  • Abaikan file yang diberikan hanya dalam diberikan (sub) direktori (Anda dapat menggunakan /sub/foodi .gitignore, meskipun).

Harap diingat bahwa pola dalam .gitignorefile berlaku secara rekursif ke direktori (sub) file di dan semua subdirektori, kecuali pola berisi '/' (jadi misalnya pola nameberlaku untuk file apa pun yang disebutkan namedalam direktori tertentu dan semua subdirektori, sementara /nameberlaku untuk file dengan nama ini hanya di direktori yang diberikan).

Jakub Narębski
sumber
1
Ah, untuk beberapa alasan saya pikir /Documentation/*.html akan membahas ini, tapi saya kira * wild card hanya akan cocok dengan direktori pada satu level.
Conley Owens
9
@ConleyOwens: dengan Git modern yang dapat Anda gunakan Documentation/**/*.html(perhatikan bahwa sembarang slash pola; yang /foodigunakan untuk jangkar file langsung di direktori)
Jakub Narębski
97

Sebagai catatan tangensial, satu kasus di mana kemampuan untuk memiliki banyak .gitignorefile sangat berguna adalah jika Anda menginginkan direktori tambahan dalam copy pekerjaan Anda yang tidak pernah ingin Anda komit. Cukup letakkan 1-byte .gitignore(hanya berisi satu tanda bintang) di direktori itu dan itu tidak akan pernah muncul di git statusdll.

Aristoteles Pagaltzis
sumber
4
Anda juga dapat menggunakan file ".git / info / exclude" untuk itu
Ayell
10
Tentu, jika Anda tidak keberatan harus membuka file di lokasi di suatu tempat dari root repositori, kemudian menulis seluruh path ke dalamnya, dan kemudian ingat untuk membersihkan entri jika / ketika Anda menghapus direktori. Bandingkan dengan printf \* > .gitignore(pembersihan otomatis ketika Anda menghapus direktori). Saya yakin ada situasi di mana .git/info/excludeada pilihan yang lebih tepat, tetapi tidak banyak.
Aristoteles Pagaltzis
Ya, ketika Anda ingin mengecualikan file, bukan folder misalnya: p
Ayell
4
Saya berkata "jika Anda ingin direktori tambahan dalam copy pekerjaan Anda, Anda tidak pernah ingin melakukan" dalam jawaban saya.
Aristoteles Pagaltzis
1
Karena ini membuat lebih sedikit kekacauan di root .gitignore, saya sangat menyukai pendekatan ini.
David A. Grey
59

Anda dapat memiliki banyak .gitignore, masing-masing tentu saja di direktori sendiri.
Untuk memeriksa aturan gitignore bertanggung jawab untuk mengabaikan file, gunakan git check-ignore: git check-ignore -v -- afile.

Dan Anda dapat memiliki versi berbeda dari .gitignorefile per cabang: Saya telah melihat konfigurasi semacam itu untuk memastikan satu cabang mengabaikan file sementara cabang lainnya tidak: lihat pertanyaan ini misalnya .

Jika repo Anda menyertakan beberapa proyek independen, akan lebih baik untuk merujuknya sebagai submodul .
Itu akan menjadi praktik terbaik aktual, yang memungkinkan masing-masing proyek tersebut dikloning secara independen (dengan .gitignorefile masing-masing ), sementara direferensikan oleh revisi khusus dalam proyek induk global.
Lihat sifat sebenarnya dari submodula untuk informasi lebih lanjut.


Perhatikan bahwa, sejak git 1.8.2 (Maret 2013) Anda dapat melakukan git check-ignore -v -- yourfileuntuk melihat gitignore mana yang dijalankan (dari .gitignorefile mana ) diterapkan ke ' yourfile', dan lebih memahami mengapa kata file tersebut diabaikan.
Lihat " aturan mana gitignoreyang mengabaikan file saya? "

VONC
sumber
17

Pro tunggal

  • Mudah ditemukan.

  • Memburu aturan pengecualian bisa sangat sulit jika saya memiliki beberapa gitignore, pada beberapa level dalam repo.

  • Dengan banyak file, Anda juga biasanya berakhir dengan duplikasi yang adil.

Pro berganda

  • Lingkup "pengetahuan" ke bagian bagan file tempat diperlukan.

  • Karena Git hanya melacak file, gitignore kosong adalah satu-satunya cara untuk melakukan direktori "kosong".

    (Dan sebelum Git 1.8, satu-satunya cara untuk mengecualikan pola seperti my/**.exampleadalah membuat my/.gitignoredengan pola **.foo. Alasan ini tidak berlaku sekarang, seperti yang dapat Anda lakukan /my/**/*.example.)


Saya lebih suka satu file, di mana saya dapat menemukan semua pengecualian. Saya tidak pernah melewatkan per-direktori .svn, dan saya juga tidak akan melewatkan per-direktori .gitignore.

Yang mengatakan, banyak gitignores cukup umum. Jika Anda menggunakannya, setidaknya konsistenlah dalam menggunakannya agar masuk akal untuk digunakan. Misalnya, Anda dapat meletakkannya di direktori hanya satu tingkat dari root.

Paul Draper
sumber
".gitignore kosong adalah satu-satunya cara untuk melakukan direktori" kosong "." Sebenarnya saya menemukan bahwa mengunggah satu file README (atau file yang dinamai emptydemikian) lebih umum.
Marc.2377
6
.gitkeep adalah cara yang bagus untuk melakukan ini juga ... hanya konvensi lain. Saya suka ide menggunakan file readme, karena Anda bisa menjelaskan untuk apa direktori tersebut digunakan, dalam file read me.
Gavin Pickin
8

Ada banyak skenario di mana Anda ingin berkomitmen direktori untuk repo Git Anda tapi tanpa file di dalamnya, misalnya logs, cache, uploadsdirektori dll

Jadi yang selalu saya lakukan adalah menambahkan .gitignorefile di direktori tersebut dengan konten berikut:

*
!.gitignore

Dengan .gitignorefile ini , Git tidak akan melacak file apa pun di direktori tersebut tetapi masih mengizinkan saya untuk menambahkan .gitignorefile dan karenanya direktori itu sendiri ke repo.

Lukman
sumber