11 poin oleh GN⁺ 4 jam lalu | 3 komentar | Bagikan ke WhatsApp
  • 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

 
sudoeng 1 jam lalu

Akan berguna juga jika hal seperti spesifikasi kerja atau file plan.md dimasukkan ke .git/info/exclude.

 
yangeok 2 jam lalu

Ternyata ada juga pengaturan yang bisa disetel di root ya, hehe

 
GN⁺ 4 jam lalu
Pendapat Hacker News
  • Tulisan yang menarik, tetapi fitur favorit saya di Git, yaitu hampir mengabaikan, tidak disebut: .gitattributes
    Dengan file ini, Anda bisa menentukan agar Git "mengabaikan" perbedaan pada file tertentu. Misalnya, package-lock.json pada 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 di package.json
    Jika Anda menambahkan satu baris package-lock.json -diff ke .gitattributes di root proyek, file tersebut tetap akan di-stage/di-commit, tetapi git diff tidak akan menampilkan diff besar yang tidak bermakna

    • package-lock.json seharusnya bukan noise. Jika Anda tidak memang berniat memperbaruinya, seharusnya jangan diubah, kalau tidak Anda jadi terekspos pada risiko rantai pasok tanpa alasan
      Jika perubahan package-lock.json sering muncul tanpa diduga, berarti ada yang salah dalam cara kerja Anda
    • package-lock.json menampilkan semua dependensi transitif, sedangkan package.json hanya menampilkan dependensi langsung. Jadi pernyataan bahwa yang belakangan adalah "versi asli yang bisa dibaca manusia" tidak benar
      Keduanya punya tujuan berbeda, dan mengatakan bahwa diff lockfile selalu boleh diabaikan itu berbahaya
    • Dari sudut pandang orang yang melakukan upgrade dependensi dan melacak penyebab bug, saya akan sangat kesal jika git diff tidak menampilkan diff lockfile
      Saya 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 .gitignore semua 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 diperbarui
    Prinsip pribadi saya adalah .gitignore di 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

    • Bahwa pengaturan .gitignore global perlu sering dijelaskan adalah konsekuensi alami dari prinsip bahwa .gitignore dalam repositori hanya dipakai untuk item khusus repositori
      Kalau ingin menghemat waktu semua orang, lebih baik langsung masukkan file-file seperti itu ke .gitignore di semua proyek
    • Saya selalu memasukkannya ke .gitignore proyek agar orang yang belum tahu tidak sampai menambahkan file-file itu ke proyek
      Pada 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
    • Saya lebih memilih sisi gitignore karena tetap bertahan meskipun development container dibangun ulang
      Jika harus menghindari gitignore, pengaturan memang bisa dipulihkan/dipertahankan lewat skrip pembuatan atau volume, tetapi itu berarti butuh skrip tambahan atau konfigurasi mount devcontainer, alih-alih satu baris di .gitignore
    • Bukankah agak bertentangan jika Anda terus melihat perilaku yang sama yang salah, tetapi sekaligus membuat aturan ketat yang secara eksplisit melarang cara termudah untuk memperbaikinya?
  • Untuk pengaturan Git global dan file ignore, menurut saya lebih tepat meletakkannya di ~/.config/git/ignore dan ~/.config/git/config daripada membuat ~/.gitignore_global dan mengubah konfigurasinya
    Jika ~/.config/ dipakai untuk banyak hal, dotfiles di level root jadi jauh lebih sedikit
    Alasan 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

    • Sebagai bonus, jika direktori ~/.config Anda dikontrol versinya, perubahan di masa depan bisa dikelola dan dibagikan
    • Anda juga bisa memakai ~/.cvsignore untuk alat lain yang menggunakan file yang sama
  • Entah belajar dari mana, saya menambahkan attic ke global Git ignore
    Dengan begitu saya bisa membuat direktori attic di 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 itu

    • Bisa juga dilakukan dengan cara yang agak terbalik, tetapi harus satu per satu sesuai kasus
      Jika ada direktori seperti attic, Anda bisa membuat attic/.gitignore dan menaruh /** di dalamnya, maka direktori itu dan seluruh isinya akan diabaikan, termasuk file ignore itu sendiri
      Biasanya saya memberi nama direktori versi saya dengan satu karakter U+1F4A9, tetapi HN tidak mengizinkannya dimasukkan ke komentar
    • Kalau saya memakai aux
      Saya menyembunyikannya dengan menaruh .gitignore yang hanya berisi satu tanda bintang *, sehingga dirinya sendiri dan semua isi di dalamnya diabaikan
    • Saya juga melakukan ini. Hanya saja namanya saya buat .local
    • Milik saya scratch/
      Sejauh ini belum pernah jadi masalah
  • Soal ignore per pengguna, untuk macOS memang idealnya .DS_Store ditambahkan di sana, tetapi semua pengguna Mac di proyek itu harus melakukannya
    Jika ada dua orang atau lebih, mungkin lebih baik jangan diserahkan ke masing-masing

    • Saya tidak yakin dari mana asalnya, tetapi di kedua Mac saya (satu Ventura, satu Sequoia) ada entri .DS_Store di file ~/.gitignore_global, dan di konfigurasi Git global juga ada pengaturan untuk mengabaikan entri dari file itu
      Tanggal 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 .gitignore sudah berakhir
    • Cara Anda melihat minoritas dan mayoritas cukup unik. Jika satu pengguna macOS bekerja di sepuluh proyek, apakah kesepuluh proyek itu harus menambahkan baris tersebut, atau lebih baik ditangani di sisi satu pengguna itu saja?
  • Wah, bagaimana saya bisa tidak tahu ini? Saya sudah 20 tahun jadi pengembang perangkat lunak profesional dan selama ini hanya memakai .gitignore
    Saya sadar saya bahkan tidak pernah bertanya pada diri sendiri apakah ada cara yang lebih baik daripada mengacaukan .gitignore dengan segala macam pengecualian yang hanya relevan untuk saya
    Saya 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/Makefile yang hanya dipakai lokal dan tidak diperlukan atau bahkan tidak bisa dipakai oleh rekan kolaborasi

    • Saya penasaran contoh skrip yang tidak bisa dipakai rekan lain itu seperti apa. Misalnya skrip untuk alur kerja PR?
    • Sudah cukup lama saya memakai fungsi shell yang memasukkan semua file tak terlacak yang muncul di git status ke .git/info/exclude
      Biasanya saya menerapkannya setelah add dan commit hal-hal yang memang ingin saya simpan di repositori
  • Saya 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-unchanged
    unassume = update-index --no-assume-unchanged
    assumed = "!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-worktree
    Ini 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