Local-Only Excludes dengan .git/info/exclude

4 menit baca.
Tags: gitgitignorelocal-config

Kadang kamu punya file yang cuma penting di mesin sendiri: setting editor, catatan sementara, file konteks AI, atau script sekali pakai. File seperti itu tidak harus masuk .gitignore karena tim lain tidak butuh rule tersebut. Tapi kamu juga tidak mau file itu muncul terus setiap menjalankan git status.

Pakai .git/info/exclude untuk kasus ini. File ini adalah ignore file per-repository yang hidup di dalam .git, jadi Git memakainya secara lokal tapi tidak pernah meng-commit-nya.

Jawaban cepat

Tambahkan pattern lokal ke .git/info/exclude:

printf '%s\n' 'AGENTS.local.md' >> .git/info/exclude

Pastikan Git benar-benar mengabaikan file tersebut:

git check-ignore -v -- AGENTS.local.md

Output-nya kira-kira seperti ini:

.git/info/exclude:7:AGENTS.local.md	AGENTS.local.md

Nomor baris bisa berbeda di repo kamu. Bagian pentingnya adalah Git menunjukkan rule itu berasal dari .git/info/exclude.

3 mekanisme git ignore

Git punya tiga tempat umum untuk ignore rule.

Pakai .gitignore kalau rule tersebut milik project. Contohnya node_modules/, output build, file hasil generate, dan file env lokal yang memang tidak boleh di-commit siapa pun. File ini versioned, jadi setiap clone mendapat ignore rule yang sama.

Pakai core.excludesFile kalau rule tersebut milik mesin kamu dan berlaku untuk banyak repo. Contohnya .DS_Store, file sementara dari editor, atau output tool pribadi yang selalu muncul di semua project. Konfigurasinya cukup sekali:

git config --global core.excludesFile ~/.config/git/ignore

Lalu isi pattern di file tersebut.

Pakai .git/info/exclude kalau rule-nya personal tapi hanya untuk repo ini. Ini posisi tengah yang sering paling pas. Teammate tidak terkena efeknya, dan rule tersebut juga tidak bocor ke semua repo yang kamu kerjakan.

Kapan memakai .git/info/exclude

Pakai .git/info/exclude untuk file yang lokal ke satu checkout:

  • catatan sementara untuk project ini
  • file konteks AI pribadi
  • setting editor yang tidak ingin dibagikan
  • script lokal untuk debug repo ini
  • export sementara atau output command

Tes sederhananya begini: kalau file itu cuma berguna untuk kamu dan cuma di repository ini, masukkan ke .git/info/exclude.

Contoh:

# Catatan pribadi dan konteks assistant lokal
scratch.md
AGENTS.local.md
.claude/local/

Dengan begitu git status tetap bersih tanpa membuat .gitignore project membawa workflow pribadi kamu.

Jangan pakai ini untuk rule tim

Kalau semua orang harus mengabaikan file yang sama, commit rule-nya di .gitignore.

Local exclude tidak terlihat oleh clone lain. Itu memang tujuannya. Tapi itu juga berarti local exclude adalah tempat yang salah untuk behavior project yang shared. Kalau build kamu membuat dist/, atau test runner membuat coverage/, ignore rule biasanya harus ada di .gitignore supaya contributor baru tidak perlu menemukan ulang rule tersebut.

Pembagiannya sederhana:

  • file hasil generate project: .gitignore
  • file personal untuk semua repo: core.excludesFile
  • file personal untuk repo ini saja: .git/info/exclude

Typo yang gampang terjadi

Path ini mudah kebalik di kepala. Bukan ini:

.git/exclude/info

Tapi ini:

.git/info/exclude

Kalau hanya mau mengingat satu bentuk command, pakai ini:

printf '%s\n' '<pattern>' >> .git/info/exclude

Path itu sudah ada di setiap repository Git. Kamu tidak perlu membuatnya dari nol.

Verifikasi rule

Setelah menambahkan pattern, jalankan:

git check-ignore -v -- <file>

Contoh:

git check-ignore -v -- AGENTS.local.md

Kalau file tersebut di-ignore, Git akan mencetak rule yang cocok dan sumbernya:

.git/info/exclude:7:AGENTS.local.md	AGENTS.local.md

Kalau tidak ada output, berarti Git tidak menemukan ignore rule yang cocok. Cek path, pattern, dan ejaan .git/info/exclude.

Kamu juga bisa melihat status dengan file ignored ditampilkan:

git status --ignored --short

File yang di-ignore akan muncul dengan prefix !!.

Kalau file sudah tracked

Ignore rule hanya berlaku untuk file yang belum tracked. Kalau Git sudah track file tersebut, menambahkannya ke .git/info/exclude tidak akan menyembunyikan perubahan berikutnya.

Cek apakah file sudah tracked:

git ls-files -- AGENTS.local.md

Kalau command itu mencetak path file, berarti Git sudah track file tersebut.

Untuk file yang memang harus berhenti di-track oleh repo, hapus dari index tanpa menghapus copy lokal:

git rm --cached AGENTS.local.md

Lalu commit perubahan itu kalau memang ini cleanup repository. Hati-hati di bagian ini: menghapus file tracked akan berdampak ke semua orang setelah mereka pull. Untuk file yang murni personal, solusi yang lebih baik biasanya adalah jangan commit file itu dari awal, lalu tambahkan pattern lokal ke .git/info/exclude.

Ini bukan manajemen secret

Ignore rule membantu menghindari commit tidak sengaja. Ignore rule tidak membuat sebuah file menjadi aman.

Kalau file berisi credential, jangan sampai file itu ikut masuk ke log, komentar issue, prompt AI, atau backup bersama. Untuk file env project, pola yang umum adalah commit contoh seperti .env.example, ignore file asli seperti .env, lalu load secret dari mesin lokal atau platform deployment.

Kesimpulan

Pakai .git/info/exclude untuk file per-repo yang hanya penting di mesin kamu. Pakai .gitignore untuk rule project yang shared. Pakai core.excludesFile untuk rule personal yang berlaku di semua repo.

Kalau ragu, tambahkan pattern secara lokal dan verifikasi:

printf '%s\n' 'AGENTS.local.md' >> .git/info/exclude
git check-ignore -v -- AGENTS.local.md