Apa sintaks yang tepat untuk .gitignore
file untuk mengabaikan file dalam direktori?
Apakah itu akan terjadi?
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
atau
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
.gitignore
membedakan antara file dan direktori yang diabaikannya? misalnya, apakahdata
vsdata/
bermakna berbeda?data
akan mengabaikan file dan direktori yang cocok,data/
hanya akan mengabaikan direktori yang cocok.Jawaban:
FORMAT POLA
Baris kosong tidak cocok dengan file, sehingga dapat berfungsi sebagai pemisah untuk dibaca.
Baris yang dimulai dengan
#
berfungsi sebagai komentar.Awalan opsional
!
yang meniadakan pola; setiap file yang cocok dikecualikan oleh pola sebelumnya akan dimasukkan lagi. Jika pola yang dinegasikan cocok, ini akan menimpa sumber pola prioritas yang lebih rendah.Jika pola diakhiri dengan garis miring, ia dihapus untuk tujuan uraian berikut, tetapi hanya akan menemukan kecocokan dengan direktori. Dengan kata lain,
foo/
akan cocok dengan direktorifoo
dan jalur di bawahnya, tetapi tidak akan cocok dengan file biasa atau tautan simbolikfoo
(ini konsisten dengan cara bagaimana pathspec bekerja secara umum di git).Jika polanya tidak mengandung slash
/
, git memperlakukannya sebagai pola shell glob dan memeriksa kecocokan dengan pathname relatif terhadap lokasi.gitignore
file (relatif terhadap level tertinggi pohon kerja jika bukan dari.gitignore
file).Jika tidak, git memperlakukan polanya sebagai gumpalan shell yang cocok untuk dikonsumsi dengan
fnmatch(3)
denganFNM_PATHNAME
flag: wildcard dalam polanya tidak akan cocok dengan/
dalam pathname. Misalnya,Documentation/*.html
cocokDocumentation/git.html
tetapi tidakDocumentation/ppc/ppc.html
atautools/perf/Documentation/perf.html
.Garis miring terkemuka cocok dengan awal pathname. Misalnya,
/*.c
cocokcat-file.c
tetapi tidakmozilla-sha1/sha1.c
.Anda dapat menemukan lebih banyak di sini
git help gitignore
atau
man gitignore
sumber
man
halaman atau dokumen resmi adalah format terbaik untuk SO ...Itu akan menjadi yang pertama. Pergi dengan ekstensi juga alih-alih struktur folder.
Misalnya saya mengabaikan file pengembangan C #:
Memperbarui
Saya pikir saya akan memberikan pembaruan dari komentar di bawah ini. Meskipun tidak secara langsung menjawab pertanyaan OP, lihat yang berikut untuk contoh lebih lanjut
.gitignore
sintaks.Wiki komunitas (terus diperbarui):
.gitignore untuk Proyek dan Solusi Visual Studio
Lebih banyak contoh dengan penggunaan bahasa tertentu dapat ditemukan di sini (terima kasih atas komentar Chris McKnight):
https://github.com/github/gitignore
sumber
range
. Jadi cocok*.Obj
juga*.obj
.Jalur yang berisi garis miring dianggap relatif terhadap direktori yang berisi file .gitignore - biasanya tingkat teratas dari repositori Anda, meskipun Anda juga dapat menempatkannya di subdirektori.
Jadi, karena dalam semua contoh yang Anda berikan, path berisi garis miring, kedua versi itu identik. Satu-satunya waktu yang Anda butuhkan untuk membuat garis miring adalah ketika tidak ada yang berada di jalurnya. Misalnya, untuk mengabaikan foo hanya di tingkat atas repositori, gunakan
/foo
. Cukup menulisfoo
akan mengabaikan apa pun yang disebut foo di mana saja di repositori.Kartu liar Anda juga berlebihan. Jika Anda ingin mengabaikan seluruh direktori, cukup beri nama:
Satu-satunya alasan untuk menggunakan wildcard seperti yang Anda miliki adalah jika Anda berniat untuk kemudian mengabaikan sesuatu di direktori:
sumber
Sebuah slash terkemuka menunjukkan bahwa entri abaikan hanya valid terkait dengan direktori tempat file .gitignore berada. Menentukan
*.o
akan mengabaikan semua file .o di direktori ini dan semua subdirs, sementara/*.o
hanya mengabaikannya dalam direktori itu, sementara lagi,/foo/*.o
hanya akan mengabaikannya di /foo/*.o.sumber
Jika Anda ingin meletakkan file .gitignore di tingkat atas dan membuatnya berfungsi untuk folder apa pun di bawahnya gunakan
/**/
.Misalnya untuk mengabaikan semua
*.map
file dalam/src/main/
folder dan sub-folder gunakan:sumber
**
. Satu sudah cukup untukku.Kedua contoh dalam pertanyaan tersebut adalah contoh yang sangat buruk yang dapat menyebabkan hilangnya data!
Saran saya: jangan pernah menambahkan
/*
direktori ke file .gitignore, kecuali Anda punya alasan bagus!Alasan yang bagus adalah misalnya apa yang ditulis Jefromi: "jika Anda berniat untuk kemudian mengabaikan sesuatu di direktori" .
Alasan mengapa itu seharusnya tidak dilakukan adalah penambahan itu
/*
direktori pada satu sisi berfungsi dengan cara yang mengabaikan semua isi direktori dengan benar, tetapi di sisi lain itu memiliki efek samping yang berbahaya:Jika Anda mengeksekusi
git stash -u
(untuk sementara menyimpan file yang dilacak dan tidak dilacak) ataugit clean -df
(untuk menghapus file yang tidak terlacak tetapi tetap diabaikan) di repositori Anda, semua direktori yang diabaikan dengan yang ditambahkan/*
akan dihapus secara permanen !Beberapa latar belakang
Saya harus belajar ini dengan cara yang sulit. Seseorang di tim saya menambahkan
/*
ke beberapa direktori di .gitignore kami. Seiring waktu saya memiliki kesempatan di mana direktori tertentu akan tiba-tiba menghilang. Direktori dengan gigabytes data lokal yang dibutuhkan oleh aplikasi kita. Tidak ada yang bisa menjelaskannya dan saya selalu ingin mengunduh ulang semua data. Setelah beberapa saat saya mendapat gagasan bahwa itu mungkin ada hubungannya dengangit stash
. Suatu hari saya ingin membersihkan repo lokal saya (sambil menyimpan file yang diabaikan) dan saya menggunakangit clean -df
dan lagi data saya hilang. Kali ini saya sudah cukup dan menyelidiki masalah ini. Saya akhirnya tahu bahwa alasannya adalah ditambahkan/*
.Saya berasumsi itu bisa dijelaskan entah bagaimana oleh fakta yang
directory/*
mengabaikan semua isi direktori tetapi bukan direktori itu sendiri. Karena itu tidak dianggap dilacak atau diabaikan ketika hal-hal dihapus. Meski begitugit status
dangit status --ignored
memberikan gambaran yang sedikit berbeda di atasnya.Bagaimana cara mereproduksi
Inilah cara mereproduksi perilaku. Saat ini saya menggunakan Git 2.8.4.
Direktori yang disebut
localdata/
dengan file dummy di dalamnya (important.dat
) akan dibuat di repositori git lokal dan isinya akan diabaikan dengan memasukkan/localdata/*
ke dalam.gitignore
file tersebut. Ketika salah satu dari dua perintah git yang disebutkan dijalankan sekarang, direktori tersebut akan (secara tak terduga) hilang.Jika Anda melakukannya di
git status --ignored
sini, Anda akan mendapatkan:Sekarang lakukan
atau
Dalam kedua kasus direktori yang diduga diabaikan
localdata
akan hilang!Tidak yakin apakah ini dapat dianggap bug, tapi saya kira itu setidaknya fitur yang tidak diperlukan siapa pun.
Saya akan melaporkannya ke daftar pengembangan git dan melihat apa yang mereka pikirkan tentang itu.
sumber
Itu akan:
atau bahkan mungkin:
dalam kasus itu
filter
danform
satu-satunya direktori di lib yang memilikibase
subdirektori yang perlu diabaikan (lihat sebagai contoh apa yang dapat Anda lakukan dengan asterik).sumber
Yang pertama. Jalur file tersebut relatif dari tempat file .gitignore Anda berada.
sumber
Saya memelihara layanan berbasis GUI dan CLI yang memungkinkan Anda membuat
.gitignore
template dengan sangat mudah di https://www.gitignore.io .Anda dapat mengetik template yang Anda inginkan di bidang pencarian atau menginstal alias baris perintah dan menjalankan
$ gi swift,osx
sumber
Contoh file .gitignore dapat terlihat seperti di bawah ini untuk proyek Android Studio
sumber