45 poin oleh GN⁺ 2026-02-24 | 2 komentar | Bagikan ke WhatsApp
  • Git mengontrol cara kerjanya melalui file-file tertentu di dalam repositori, dan ini bukan pengaturan di dalam .git/ melainkan file yang di-commit dan ikut berpindah bersama kode
  • .gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap, dan lainnya masing-masing menangani pengecualian pelacakan file, definisi atribut, konfigurasi LFS, pengelolaan submodule, dan penyatuan author
  • .git-blame-ignore-revs dan .gitmessage menyediakan pengabaian commit formatting kode serta template pesan commit untuk meningkatkan kualitas kolaborasi
  • GitHub, GitLab, Gitea, dan lainnya memperluas fungsi melalui folder konfigurasi khusus platform seperti .github/, .gitlab/, .gitea/, untuk CI/CD, penetapan reviewer, dan lain-lain
  • Pola ini melampaui Git dan juga diterapkan pada EditorConfig, Docker, alat manajemen versi bahasa, membentuk ekosistem konfigurasi otomatis berbasis dotfile

File magic utama Git

  • Git mengenali berbagai file khusus seperti .gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap untuk mengontrol perilaku repositori
    • File-file ini bukan pengaturan internal di .git/, melainkan komponen konfigurasi yang di-commit dan dibagikan, sehingga menjamin perilaku yang konsisten saat kolaborasi

.gitignore

  • Mendefinisikan pola file yang tidak boleh dilacak oleh Git
    • Mendukung wildcard (*.log), direktori (dist/), negasi (!important.log), dan lainnya
    • Diterapkan dalam urutan .gitignore, .git/info/exclude, lalu pengaturan global (~/.config/git/ignore)
  • File yang sudah dilacak akan tetap dilacak walaupun ditambahkan ke .gitignore, dan bisa dihapus dari index dengan git rm --cached
  • GitHub, GitLab, Gitea, dan lainnya tetap memungkinkan commit file yang cocok dengan pola ignore tanpa peringatan
  • GitHub menyediakan template .gitignore per bahasa di repositori resminya

.gitattributes

  • Mengontrol filter, diff, merge, line ending, dan deteksi bahasa per file
    • Contoh: *.psd filter=lfs, *.png binary, *.sh text eol=lf
  • text menormalkan line ending, binary menonaktifkan diff/merge, merge=ours mempertahankan versi lokal saat konflik
  • GitHub Linguist membaca .gitattributes untuk mengecualikan statistik bahasa, melipat generated code, dan mengecualikan dokumentasi
  • Juga mengenali .gitattributes per direktori dan .git/info/attributes

.lfsconfig

  • Menyimpan konfigurasi Git LFS bersama repositori
    • Bisa mengatur URL server LFS, jumlah retry transfer, dan lain-lain
    • Contoh:
      [lfs]
          url = https://lfs.example.com/repo
      [lfs "transfer"]
          maxretries = 3
      
  • .gitattributes menentukan file yang diproses oleh LFS, sedangkan .lfsconfig menangani detail seperti lokasi server
  • Untuk memindahkan file dari commit lama ke LFS, diperlukan perintah git lfs migrate

.gitmodules

  • Menyimpan informasi konfigurasi submodule
  • Dibuat saat menjalankan git submodule add, dan dirujuk saat git submodule update
  • Saat git clone, submodule tidak diambil otomatis; perlu opsi --recurse-submodules
  • Kekurangannya mencakup tidak bisa melacak rentang versi dan dapat membuat direktori .git bertingkat

.mailmap

  • Mengelola penyatuan nama dan email author
    • Contoh:
      Jane Developer <[email protected]> <[email protected]>
      
  • Ditampilkan dengan nama yang sudah disatukan di git log, git shortlog, git blame, dan lainnya
  • Grafik contributor GitHub tidak mencerminkan mailmap
  • Lokasi bisa ditentukan dengan .mailmap atau pengaturan mailmap.file

.git-blame-ignore-revs

  • Menentukan daftar commit yang harus diabaikan oleh git blame
    • Mengecualikan perubahan yang tidak bermakna seperti menjalankan formatter atau menerapkan lint
    • Contoh:
      # Ran prettier on entire codebase
      a1b2c3d4e5f6g7h8i9j0...
      
  • Diaktifkan dengan git config blame.ignoreRevsFile .git-blame-ignore-revs
  • GitHub, GitLab (15.4+), dan Gitea mengenalinya secara otomatis
  • Jika file tidak ada, bisa memicu error, jadi disarankan tetap menyimpan file kosong

.gitmessage

  • Mendefinisikan template pesan commit
    • Contoh:
      # <type>: <subject>
      #
      # Types: feat, fix, docs, style, refactor, test, chore
      
  • Perlu disetel dengan git config commit.template .gitmessage
  • Setelah clone, perlu konfigurasi manual; beberapa tim mengotomatiskannya dengan husky dan sejenisnya
  • Alternatifnya, bisa memakai hook commit-msg atau prepare-commit-msg

Folder ekstensi khusus platform

  • GitHub, GitLab, Gitea, Forgejo, Bitbucket, dan lainnya memakai folder konfigurasi mereka sendiri
    • .github/, .gitlab/, .gitea/, .forgejo/, .bitbucket/
  • Berisi workflow CI/CD, template issue/PR, file CODEOWNERS, dan lainnya
  • Forgejo melakukan fallback dalam urutan .forgejo/ → .gitea/ → .github/, sedangkan Gitea memakai .gitea/ → .github/
  • SourceHut menggunakan .build.yml atau .builds/*.yml

File konvensional lainnya

  • .gitkeep: karena Git tidak melacak direktori kosong, file ini dipakai sebagai file dummy untuk mempertahankan direktori
  • .gitconfig: menyediakan contoh pengaturan Git per proyek, tetapi tidak dimuat otomatis
  • .gitsigners: mengelola daftar kunci tanda tangan GPG/SSH, bisa ditentukan dengan gpg.ssh.allowedSignersFile
  • .gitreview: file konfigurasi server code review Gerrit
    • Contoh:
      [gerrit]
      host=review.opendev.org
      port=29418
      project=openstack/nova.git
      defaultbranch=master
      
  • .gitlint: mendefinisikan aturan linting untuk pesan commit
    • Contoh:
      [general]
      ignore=body-is-missing
      [title-max-length]
      line-length=72
      
  • .jj/: direktori status milik Jujutsu, VCS yang kompatibel dengan Git, dan bisa hadir berdampingan dengan .git/

Ekosistem dotfile di luar Git

  • .editorconfig: menjaga konsistensi gaya kode antar editor
    • Mendefinisikan indentasi, line ending, encoding, penghapusan whitespace, dan lainnya
    • Didukung editor utama seperti VS Code, Vim, dan Emacs
  • .ruby-version, .node-version, .python-version: dibaca oleh alat manajemen versi bahasa (rbenv, nodenv, pyenv, dll.) untuk melakukan switch otomatis
  • .tool-versions: file manajemen versi multi-bahasa milik asdf
  • .dockerignore: menentukan daftar file yang dikecualikan saat build Docker
    • Menggunakan sintaks pola yang sama seperti .gitignore, membantu mempercepat build dan mengecualikan rahasia

Hal yang perlu diperhatikan saat mengembangkan alat integrasi Git

  • Alat yang menangani repositori Git wajib mengenali file-file berikut
    • .gitignore: menerapkan pola ignore saat menelusuri file
    • .gitattributes: membedakan file biner dan file hasil generate
    • .mailmap: menampilkan informasi author yang sudah disatukan
    • .gitmodules: menangani submodule
  • Format file konfigurasi Git berbentuk [section "subsection"] key = value, dan bisa dibaca/ditulis dengan perintah git config
  • Sebagian besar library Git untuk berbagai bahasa menyediakan kemampuan untuk mem-parsing format ini

2 komentar

 
wedding 2026-02-24

Saya belum tahu soal gitmessage, tapi sepertinya harus saya coba.

 
GN⁺ 2026-02-24
Komentar Hacker News
  • Disebutkan bahwa GitHub, GitLab, dan Gitea semuanya menghormati .gitignore sehingga file yang diabaikan tidak ditampilkan di web UI, tetapi penjelasan itu tampaknya keliru.
    Sebenarnya file tersebut tidak terlihat karena tidak termasuk dalam repositori. Jika sebuah file sudah di-commit, menurut saya justru seharusnya tetap terlihat
    • Bukan begitu. Jika file yang sudah di-push kemudian ditambahkan ke .gitignore, file itu tetap terlihat di UI. Itu karena file tersebut masih bagian dari repo.
      Sebaliknya, file yang diabaikan sejak awal juga bisa dipaksa untuk di-commit, meskipun perlu sedikit trik
    • Betul, komentar aslinya salah. .gitignore hanya menentukan apakah file untracked disembunyikan atau tidak. Kalau mau, file yang diabaikan pun tetap bisa di-commit
    • Rasanya akan bagus kalau ada opsi seperti showinwebui=(true|false) 😄
    • Saya merasa mustahil bagian itu ditulis langsung oleh manusia, jadi saya berhenti membaca di situ
  • Saya ingin menekankan .git/info/exclude. Ini adalah gitignore khusus lokal, jadi hanya berlaku untuk saya sendiri.
    Misalnya berguna saat sedang menyelidiki bug dan membuat file sementara yang ingin tetap ada meski saya pindah branch.
    Saya memakai alias shell seperti ini
    git-ignore-local () {
      echo "$1" >> .git/info/exclude
    }
    
    Dengan begitu saya bisa menambahkan file secara sederhana lewat git-ignore-local myfile.ext
    • Saya membuat versi yang sedikit lebih ajaib agar tetap berfungsi meskipun tidak berada di direktori root.
      Di MacOS, hanya bagian readlink yang perlu disesuaikan
      git-ignore-local () {
        root=$(git rev-parse --show-toplevel)
        path=$(readlink -f "$1")
        relpath=$(relpath -m --relative-to="$root" "$path")
        echo "$relpath" >> "${root}.git/info/exclude"
      }
      
      Jika fungsi ini didaftarkan di PATH sebagai git-ignore-local, Anda bisa memakainya seperti git ignore-local
    • .git/info/exclude juga disebutkan di bagian awal penjelasan .gitignore
    • Saya baru tahu fitur seperti ini ada. Di proyek saya, file-file sementara kecil seperti ini membuat PR jadi berantakan, dan sepertinya ini bisa menyelesaikannya
  • Jika menambahkan /test export-ignore ke .gitattributes, Anda bisa mengecualikan file test saat deploy ke server produksi.
    Saat alat deploy seperti Capistrano menggunakan git export, ini diterapkan otomatis sehingga file test tidak ikut naik ke server.
    Tidak memengaruhi pengembangan, sambil tetap menghemat ruang disk
    • Fitur yang bagus, tetapi tampaknya kebanyakan orang bahkan tidak terlalu tahu soal git archive.
      Saya hampir tidak pernah melihatnya dipakai di alat CI dasar. Capistrano adalah contoh pertama yang saya lihat memanfaatkannya.
      Sebagai catatan, dengan opsi export-subst, Anda juga bisa menyisipkan informasi mirip git describe langsung ke dalam file
  • Saat memakai jj, saya ingin folder .jj sepenuhnya dikecualikan dari repo dan semua operasi git.
    Termasuk agar tidak terhapus oleh git clean -xdf. Untuk sementara saya mengatasinya dengan alias git clean -e .jj
    • Gunakan .git/info/exclude
  • Contributor graph GitHub tidak mendukung .mailmap
    Diskusi terkait ada di GitHub Community Discussion
  • Menurut saya pengaturan package-lock.json merge=ours berbahaya
    Karena arti ours/theirs menjadi tidak jelas saat merge atau rebase
    Pengaturan seperti ini hanya masuk akal dalam alat merge otomatis tertentu (misalnya branch git-annex)
    Referensi: penjelasan arti ours/theirs, struktur internal git-annex
  • .git-blame-ignore-revs adalah fitur yang bagus, tetapi seharusnya masuk ke bagian “konvensi lain-lain”
    Jika tidak dikonfigurasi di klien git, pada repositori yang tidak memiliki file tersebut git blame akan gagal
    • Mulai git 2.52, Anda bisa memakai opsi (:optional) agar tidak error walaupun file itu tidak ada
      Penjelasannya ada di jawaban Stack Overflow
  • Secara keseluruhan saya rasa ini daftar yang tersusun dengan baik
    Hanya saja disayangkan tidak semua alat mendukung .mailmap. Misalnya IntelliJ masih menempatkan fitur terkait dalam status bug/permintaan fitur.
    Selain itu, .git-blame-ignore-revs hanyalah sebuah konvensi, jadi tetap harus dikonfigurasi secara manual agar berfungsi
  • Agak di luar topik, tetapi saya baru-baru ini tahu bahwa VS Code juga mengenali file .ignore
    Saya kira hanya .gitignore yang berlaku, tetapi setelah mengubah pengaturan ripgrep di .ignore, hasil pencariannya ikut berubah. Ternyata perilaku itu masuk akal
  • Penulis artikel juga memposting tulisan lanjutan tentang forge-specific repository folders (semacam “folder ajaib”)
    Tautan: artikel nesbitt.io