Proyek kerap memakai symbolic link — symlink — sebagai pintasan: pintasan.txt yang menunjuk panduan.txt di folder yang sama, atau tautan ke berkas konfigurasi bersama. Pertanyaan pertama yang muncul: bagaimana Git menyimpan tautan? Jawabannya mengejutkan bagi yang belum pernah mengintip: symlink tidak disimpan sebagai “tautan ajaib”, melainkan sebagai blob biasa ber-mode 120000 yang seluruh isinya hanyalah teks path target. Konsekuensinya berjalan panjang: clone harus membangun ulang tautannya, filesystem tanpa dukungan symlink menerima berkas teks kecil sebagai gantinya, dan tautan absolut yang valid di Linux bisa mati total di Windows. Chapter ini membuktikan semuanya dengan demo nyata — ln -s, pembedahan blob, clone, konfigurasi core.symlinks — lalu menutup dengan risiko lintas sistem operasi.

Repository latihan memuat satu berkas biasa, lalu kita buat symlink pintasan.txt yang menunjuk panduan.txt:

bash
mkdir latihan-symlink && cd latihan-symlink
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'panduan menulis dokumentasi toko\n' > panduan.txt
git add panduan.txt
git commit -m "Tambah panduan dokumentasi"
ln -s panduan.txt pintasan.txt
git add pintasan.txt
git ls-files -s

Output yang Dihasilkan:

text
100644 865f935a4091d489b3239869380951dd42288822 0	panduan.txt
120000 3995baaea96210e036e40e0f8491e2ca562814e4 0	pintasan.txt

Dua entri muncul: panduan.txt ber-mode 100644 seperti biasa, dan pintasan.txt ber-mode 120000 — mode symlink yang diperkenalkan pada tabel chapter File Mode dan Permission . Isi blob pintasan.txt bisa kita baca langsung:

bash
git cat-file -p :pintasan.txt

Output yang Dihasilkan:

text
panduan.txt

Isinya adalah teks panduan.txt — path targetnya, bukan isi berkas target. Notasi :pintasan.txt berarti “objek pada entri index untuk path tersebut”. Saat git add membaca symlink, Git tidak menyalin isi panduan.txt; Git membaca path yang disimpan tautan (panduan.txt, 11 karakter), menjadikannya isi blob, dan menandai entri dengan mode 120000. Karena isinya cuma teks path, hash blob-nya pun dihitung dari string pendek itu. Kita bekukan ke riwayat:

bash
git commit -m "Tambah pintasan ke panduan"

Output yang Dihasilkan:

text
[main be7a26e] Tambah pintasan ke panduan
 1 file changed, 1 insertion(+)
 create mode 120000 pintasan.txt

Baris create mode 120000 pintasan.txt memperlihatkan mode khusus itu tercatat resmi di commit.

Bukti bahwa penyimpanan ini utuh: repository di-clone ke direktori lain, dan tautannya hidup kembali:

bash
cd ..
git clone latihan-symlink klon-symlink
cd klon-symlink
ls -l pintasan.txt
cat pintasan.txt

Output yang Dihasilkan:

text
Cloning into 'klon-symlink'...
done.

Output yang Dihasilkan:

text
lrwxrwxrwx 1 z z 11 Oct 13 12:36 pintasan.txt -> panduan.txt

Output yang Dihasilkan:

text
panduan menulis dokumentasi toko

Kolom ls -l diawali l (link) dan diakhiri pintasan.txt -> panduan.txt — clone membaca entri mode 120000, lalu membuat symlink baru dengan isi blob sebagai targetnya. cat pintasan.txt mengikuti tautan dan mengeluarkan isi panduan.txt yang asli. Kolom pemilik, grup, dan waktu pada keluaran ls -l menyesuaikan mesin dan waktu clone pembaca.

Beberapa filesystem tidak mampu membuat symlink — partisi FAT, sebagian network mount, dan Windows tanpa izin khusus. Untuk itu Git punya konfigurasi core.symlinks: ketika false, checkout menuliskan isi blob sebagai berkas teks biasa, bukan tautan:

bash
git config core.symlinks false
rm pintasan.txt
git checkout -- pintasan.txt
ls -l pintasan.txt
cat pintasan.txt

Output yang Dihasilkan:

text
-rw-rw-r-- 1 z z 11 Oct 13 12:36 pintasan.txt

Output yang Dihasilkan:

text
panduan.txt

Berkas kini berawalan - (reguler) alih-alih l, dan cat menampilkan panduan.txt — path target yang tersimpan, bukan lagi isi berkas target karena tautannya tidak ada. Menariknya, git status tetap bersih: Git menganggap berkas teks ini setara dengan entri 120000. Kita kembalikan bentuk aslinya:

bash
git config core.symlinks true
rm pintasan.txt
git checkout -- pintasan.txt
ls -l pintasan.txt

Output yang Dihasilkan:

text
lrwxrwxrwx 1 z z 11 Oct 13 12:36 pintasan.txt -> panduan.txt

Symlink pulih seperti sediakala. Opsi core.symlinks hanya mengubah cara checkout; ia tidak mengubah penyimpanan.

Kebutuhan lain kadang muncul: menyimpan tautan sebagai berkas teks biasa di dalam repository — mode 100644 berisi path — lalu membiarkan tiap sistem operasi mengubahnya menjadi symlink saat dibutuhkan. Atribut symlinks di .gitattributes dirancang untuk mengatur konversi semacam itu, misalnya pintasan.txt symlinks=false. Pada Git 2.47 — versi yang dipakai materi ini — atribut tersebut belum mengubah perilaku: git check-attr membaca labelnya, tetapi symlink tetap tersimpan 120000 dan berkas teks tetap 100644 (dibuktikan lewat uji nyata git ls-files -s setelah keduanya di-git add). Sampai atribut ini benar-benar diterapkan pada versi Git yang lebih baru — cek dokumentasi gitattributes — praktik yang berjalan adalah menyimpan berkas teks berisi path, lalu membuat symlink sungguhan pada langkah instalasi atau build.

Risiko Lintas OS: Tautan Absolut #

Symlink relatif seperti panduan.txt ikut ke mana pun repository dipindahkan. Tautan absolut hanya hidup di mesin yang benar-benar memiliki path itu:

bash
cd ../latihan-symlink
ln -s /usr/bin/env alat-env
git add alat-env
git commit -m "Tambah tautan absolut ke env"
cd ..
git clone latihan-symlink klon-absolut
cd klon-absolut
ls -l alat-env

Output yang Dihasilkan:

text
Cloning into 'klon-absolut'...
done.

Output yang Dihasilkan:

text
lrwxrwxrwx 1 z z 12 Oct 13 12:36 alat-env -> /usr/bin/env

Di Linux tautan ini sah — /usr/bin/env memang ada. Di Windows path /usr/bin/env tidak ada, sehingga checkout menghasilkan tautan mati (dangling) yang menunjuk ke nirwarna. Windows menambah satu lapis syarat lagi: membuat symlink membutuhkan Developer Mode atau hak administrator; tanpa itu Git untuk Windows memasang core.symlinks false dan checkout berlangsung sebagai berkas teks. Perilaku per sistem dirangkum berikut:

SistemDukungan symlinkPerilaku checkout Git
Linuxnativetautan dibuat utuh (core.symlinks true bawaan)
macOSnativesama seperti Linux
Windowsbutuh Developer Mode/administratortanpa izin: berkas teks berisi path (core.symlinks false)
FAT / network mount kasartidak tersediaberkas teks berisi path

Satu mode 120000 menyimpan path; blobnya tetap teks yang terbaca manusia. Chapter berikutnya menutup bagian ini dengan berkas yang isinya sama sekali tidak terbaca — berkas biner — dan bagaimana git diff tetap bisa diajak bekerja sama. Lanjut ke File Biner dan Diff .