- Aturan pengabaian file di Git terbagi menjadi tiga tingkat menurut cakupan berbagi:
.gitignore, .git/info/exclude, dan ~/.config/git/ignore
.gitignore di-commit bersama kode repositori, sehingga merupakan tempat untuk aturan bersama yang harus diterapkan oleh tim atau proyek
- Item seperti file pribadi atau file untuk pekerjaan lokal, yang diperlukan di repositori tetapi kurang tepat dijadikan aturan tim, lebih cocok diletakkan di
.git/info/exclude
- File yang berulang kali ingin dikecualikan di semua repositori, seperti
.DS_Store di macOS, dapat dimasukkan ke ~/.config/git/ignore, yaitu file ignore global tingkat mesin
git check-ignore -v <nama_file> berguna untuk melacak aturan mana yang membuat sebuah file diabaikan, dan jika tidak ada aturan yang cocok maka tidak akan ada output
Lokasi penerapan aturan ignore Git
- Git dapat memproses aturan pengabaian file di tiga lokasi
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore: aturan bersama yang di-commit ke repositori
.gitignore adalah file umum untuk menuliskan nama file yang ingin diabaikan
- File ini di-check in ke Git bersama kode lainnya
- File yang cocok dengan aturan di
.gitignore tidak akan dipertimbangkan saat menjalankan perintah git
.git/info/exclude: aturan pribadi per repositori
- File
exclude berada di dalam direktori .git pada setiap repositori Git
- Perubahan pada file ini tidak di-check in ke Git
- Pada repositori Git baru, biasanya sudah berisi beberapa baris komentar
- Cocok untuk file yang ingin diabaikan hanya pada repositori tertentu, tetapi tidak ingin dimasukkan ke
.gitignore
- Contoh: jika Anda ingin
notes.txt yang hanya diperlukan untuk alur kerja pribadi tidak di-commit ke repositori, namun juga tidak ingin menambahkannya ke .gitignore proyek, tambahkan notes.txt ke .git/info/exclude
~/.config/git/ignore: aturan global tingkat mesin
- File
ignore global berada di ~/.config/git/ignore dalam direktori home
- Nama file yang ditambahkan di sini akan diabaikan secara global pada tingkat mesin
- File ini tidak di-check in ke Git dan tidak terkait dengan repositori tertentu
- Ini tempat yang tepat untuk file yang ingin diabaikan di semua repositori Git pada komputer Anda
- Contoh: di macOS, cocok untuk menambahkan
.DS_Store ke sini
Mengubah path file ignore global
- File ignore global dapat diarahkan ke file lain
- Untuk menggunakan
.gitignore_global sebagai file ignore Git global, jalankan perintah berikut
git config --global core.excludesFile ~/.gitignore_global
- Untuk mengembalikannya ke pengaturan default, jalankan perintah berikut
git config --global --unset core.excludesFile
Memeriksa aturan mana yang mengabaikan file
- Dengan
git check-ignore -v <nama_file>, Anda dapat memeriksa aturan mana yang menyebabkan file tertentu diabaikan
- Untuk melihat bagaimana
.DS_Store diabaikan, jalankan perintah berikut di dalam repositori Git
git check-ignore -v .DS_Store
- Jika
.gitignore repositori mengabaikan .DS_Store, contoh output-nya adalah sebagai berikut
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- Jika
.git/info/exclude repositori mengabaikan .DS_Store, contoh output-nya adalah sebagai berikut
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- Jika file global
~/.config/git/ignore mengabaikan .DS_Store, contoh output-nya adalah sebagai berikut
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- Jika file ignore global kustom
.gitignore_global mengabaikan .DS_Store, contoh output-nya adalah sebagai berikut
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- Jika tidak ada aturan yang mengabaikan file tertentu, perintah
git check-ignore -v tidak akan menghasilkan output apa pun
3 komentar
Akan berguna juga jika hal seperti spesifikasi kerja atau file
plan.mddimasukkan ke.git/info/exclude.Ternyata ada juga pengaturan yang bisa disetel di root ya, hehe
Pendapat Hacker News
Tulisan yang menarik, tetapi fitur favorit saya di Git, yaitu hampir mengabaikan, tidak disebut:
.gitattributesDengan file ini, Anda bisa menentukan agar Git "mengabaikan" perbedaan pada file tertentu. Misalnya,
package-lock.jsonpada proyek Node nyaris murni berisi noise dari sudut pandang Git. Yang muncul hanyalah diff besar berisi versi spesifik pustaka, sementara informasi versi yang benar-benar mudah dibaca manusia ada terpisah dipackage.jsonJika Anda menambahkan satu baris
package-lock.json -diffke.gitattributesdi root proyek, file tersebut tetap akan di-stage/di-commit, tetapigit difftidak akan menampilkan diff besar yang tidak bermaknapackage-lock.jsonseharusnya bukan noise. Jika Anda tidak memang berniat memperbaruinya, seharusnya jangan diubah, kalau tidak Anda jadi terekspos pada risiko rantai pasok tanpa alasanJika perubahan
package-lock.jsonsering muncul tanpa diduga, berarti ada yang salah dalam cara kerja Andapackage-lock.jsonmenampilkan semua dependensi transitif, sedangkanpackage.jsonhanya menampilkan dependensi langsung. Jadi pernyataan bahwa yang belakangan adalah "versi asli yang bisa dibaca manusia" tidak benarKeduanya punya tujuan berbeda, dan mengatakan bahwa diff lockfile selalu boleh diabaikan itu berbahaya
git difftidak menampilkan diff lockfileSaya paham itu bisa terlihat seperti noise per baris, tetapi ketika dibutuhkan, itu benar-benar penting
Pengaturan pengecualian global/per pengguna adalah fitur yang seharusnya lebih dikenal luas. Saya sering menerima perubahan yang ingin menambahkan file terkait IDE/OS/AI ke
.gitignoresemua proyek, dan kebanyakan orang senang saat diberi tahu bahwa kalau dimasukkan ke pengaturan standar, file-file itu akan diabaikan di mana pun, tidak perlu menyentuh tiap proyek, dan juga mengurangi risiko ter-commit secara tidak sengaja di proyek yang.gitignore-nya belum diperbaruiPrinsip pribadi saya adalah
.gitignoredi dalam repositori sebaiknya hanya dipakai untuk item khusus repositori seperti hasil build atau folder dependensi, sedangkan sebagian besar alat pengguna seharusnya masuk ke pengaturan pengguna masing-masing.gitignoreglobal perlu sering dijelaskan adalah konsekuensi alami dari prinsip bahwa.gitignoredalam repositori hanya dipakai untuk item khusus repositoriKalau ingin menghemat waktu semua orang, lebih baik langsung masukkan file-file seperti itu ke
.gitignoredi semua proyek.gitignoreproyek agar orang yang belum tahu tidak sampai menambahkan file-file itu ke proyekPada akhirnya file itu toh akan dihapus lagi dari Git dan orang itu akan repot, jadi saya mencegahnya lebih awal demi kebaikan mereka. Mungkin ke depannya saya akan kurang baik hati soal ini
gitignorekarena tetap bertahan meskipun development container dibangun ulangJika harus menghindari
gitignore, pengaturan memang bisa dipulihkan/dipertahankan lewat skrip pembuatan atau volume, tetapi itu berarti butuh skrip tambahan atau konfigurasi mountdevcontainer, alih-alih satu baris di.gitignoreUntuk pengaturan Git global dan file ignore, menurut saya lebih tepat meletakkannya di
~/.config/git/ignoredan~/.config/git/configdaripada membuat~/.gitignore_globaldan mengubah konfigurasinyaJika
~/.config/dipakai untuk banyak hal, dotfiles di level root jadi jauh lebih sedikitAlasan Git exclude lebih jarang dipakai adalah karena tidak di-commit ke repositori, jadi harus dibuat ulang setiap kali ingin menggunakannya. Bukan berarti itu buruk, hanya itu alasan kenapa lebih jarang dipakai
~/.configAnda dikontrol versinya, perubahan di masa depan bisa dikelola dan dibagikan~/.cvsignoreuntuk alat lain yang menggunakan file yang samaEntah belajar dari mana, saya menambahkan
atticke global Git ignoreDengan begitu saya bisa membuat direktori
atticdi proyek mana pun untuk menyimpan berbagai hal yang sama sekali tidak boleh di-commit. Sejauh ini saya belum pernah melihat repositori yang memang memeriksa keberadaan direktori seperti ituJika ada direktori seperti
attic, Anda bisa membuatattic/.gitignoredan menaruh/**di dalamnya, maka direktori itu dan seluruh isinya akan diabaikan, termasuk file ignore itu sendiriBiasanya saya memberi nama direktori versi saya dengan satu karakter U+1F4A9, tetapi HN tidak mengizinkannya dimasukkan ke komentar
auxSaya menyembunyikannya dengan menaruh
.gitignoreyang hanya berisi satu tanda bintang*, sehingga dirinya sendiri dan semua isi di dalamnya diabaikan.localscratch/Sejauh ini belum pernah jadi masalah
Soal ignore per pengguna, untuk macOS memang idealnya
.DS_Storeditambahkan di sana, tetapi semua pengguna Mac di proyek itu harus melakukannyaJika ada dua orang atau lebih, mungkin lebih baik jangan diserahkan ke masing-masing
.DS_Storedi file~/.gitignore_global, dan di konfigurasi Git global juga ada pengaturan untuk mengabaikan entri dari file ituTanggal file ini di Mac baru saya adalah dua hari sebelum saya memesannya, dan saya tidak ingat pernah mengaturnya sendiri, jadi sepertinya itu bawaan. Mac lama saya mungkin juga begitu, dan melihat versi macOS-nya, bisa jadi ini sudah menjadi pengaturan default sejak cukup lama
Jadi mungkin masa ketika kita harus menambahkan
.DS_Store/ke.gitignoresudah berakhirWah, bagaimana saya bisa tidak tahu ini? Saya sudah 20 tahun jadi pengembang perangkat lunak profesional dan selama ini hanya memakai
.gitignoreSaya sadar saya bahkan tidak pernah bertanya pada diri sendiri apakah ada cara yang lebih baik daripada mengacaukan
.gitignoredengan segala macam pengecualian yang hanya relevan untuk sayaSaya hanya menerima dunia yang terlihat di depan mata apa adanya
Hari ini dunia terasa sedikit lebih baik
Saya sangat sering memakai
.git/info/exclude. Ini sangat cocok untuk skrip/Makefileyang hanya dipakai lokal dan tidak diperlukan atau bahkan tidak bisa dipakai oleh rekan kolaborasigit statuske.git/info/excludeBiasanya saya menerapkannya setelah
adddancommithal-hal yang memang ingin saya simpan di repositoriSaya memakai file excludes seperti ini untuk menerapkan konfigurasi Git per proyek yang berbeda pada direktori proyek yang berisi banyak repositori
https://laszlo.nu/blog/project-level-git-config.html
Ada beberapa alias terkait yang saya pakai
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"Untuk file yang sudah dilacak, ada juga
git update-index --[no]-skip-worktreeIni bisa berguna untuk eksperimen lokal, tetapi agak merepotkan dipakai karena bukan fitur yang Git tampilkan dengan jelas di mana-mana. Anda harus ingat bahwa itu sudah disetel, dan kalau lupa, operasi lain seperti checkout bisa terhambat