Bagaimana git menangani tautan simbolik?

Jika saya memiliki file atau direktori yang merupakan tautan simbolik dan saya meletakkannya di repositori Git, apa yang terjadi padanya?

Saya akan menyarankan itu meninggalkannya sebagai tautan simbolis sampai file dihapus, dan kemudian, jika Anda mengekstrak file dari versi lama, itu hanya membuat file normal.

Apa yang dilakukan ketika saya menghapus file yang dirujuk? Apakah itu hanya memperbaiki tautan gantung?

1369
05 июня '09 в 9:53 2009-06-05 09:53 Alex diatur pada 05 Juni 2009 di 9:53 2009-06-05 09:53
@ 3 balasan

Git hanya menyimpan konten tautan (mis. Jalur ke objek sistem file yang dirujuk) dalam "gumpalan", seperti yang dilakukan untuk file biasa. Kemudian menyimpan nama, mode, dan jenis (termasuk fakta bahwa itu adalah tautan simbolik) di objek pohon yang mewakili direktori yang berisi.

Ketika Anda mengekstrak pohon yang berisi tautan, ia mengembalikan objek sebagai tautan simbolis, terlepas dari apakah objek sistem file target ada atau tidak.

Jika Anda menghapus file yang dirujuk oleh tautan simbolik, itu tidak akan memengaruhi tautan simbolik yang dikelola oleh Git. Anda akan memiliki tautan gantung. Pengguna dapat menghapus atau memodifikasi tautan untuk mengindikasikan sesuatu itu valid, jika perlu.

1146
05 июня '09 в 10:01 2009-06-05 10:01 jawabannya diberikan oleh CB Bailey 05 Juni 2009 di 10:01 2009-06-05 10:01

Tl; DR: Data yang dirujuk oleh tautan simbolik tidak disimpan dalam repositori.


Anda dapat mengetahui apa yang Git lakukan pada file dengan melihat apa yang dilakukannya ketika Anda menambahkannya ke indeks. Indeks mirip dengan awalan. Setelah memperbaiki indeks, Anda dapat menggunakan git checkout untuk mengembalikan semua yang ada di indeks kembali ke direktori kerja. Jadi apa yang dilakukan Git ketika Anda menambahkan tautan simbolis ke indeks?

Untuk mengetahuinya, pertama buat tautan simbolik:

 $ ln -s /path/referenced/by/symlink symlink 

Git belum tahu tentang file ini. git ls-files memungkinkan Anda untuk memeriksa indeks Anda ( stat ):

 $ git ls-files -s ./symlink [nothing] 

Sekarang tambahkan konten tautan simbolik ke toko objek Git, tambahkan ke indeks. Ketika Anda menambahkan file ke indeks, Git menyimpan kontennya ke penyimpanan objek Git.

 $ git add ./symlink 

Jadi apa yang sudah ditambahkan?

 $ git ls-files -s ./symlink 120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink 

Hash adalah tautan ke objek terpaket yang dibuat di toko objek Git. Anda dapat memeriksa objek ini dengan melihat .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c di akar repositori Anda. File ini adalah yang disimpan oleh Git dan apa yang dapat Anda ekstrak dari repositori Anda ketika Anda menambahkan dan melakukan tautan simbolik. Jika Anda memeriksa file ini, Anda akan melihat bahwa itu sangat kecil. Itu tidak menyimpan konten file terkait.

(Perhatikan bahwa 120000 adalah mode file yang ditentukan dalam output ls-files . Ini akan menjadi sekitar 100644 untuk file biasa.)

Tapi apa yang dilakukan Git dengan objek ini ketika Anda mengambilnya dari penyimpanan dan ke dalam sistem file-nya? Itu tergantung pada konfigurasi core.symlinks . Dari man git-config :

core.symlinks

Jika salah, tautan simbolik diekstraksi dalam bentuk file kecil sederhana yang berisi teks tautan.

Dengan demikian, memiliki tautan simbolik dalam repositori, saat mengambil, Anda mendapatkan file teks dengan tautan ke path lengkap ke sistem file, atau tautan simbolik yang benar, tergantung pada nilai konfigurasi core.symlinks .

Bagaimanapun, data yang dirujuk oleh tautan simbolik tidak disimpan dalam repositori.

172
13 сент. Balas diberikan oleh Dmitry Minkovsky 13 September 2013-09-13 20:06 '13 pada 20:06 2013-09-13 20:06

Catatan Editor: Posting ini mungkin berisi informasi yang ketinggalan zaman. Silakan lihat komentar dan pertanyaan ini mengenai perubahan dalam Git sejak 1.6.1.

Direktori simbolis:

Penting untuk mencatat apa yang terjadi ketika ada direktori yang merupakan tautan lunak. Pembaruan tarikan Git apa pun memperbarui tautan dan menjadikannya direktori normal. Inilah yang saya pelajari dengan cara yang sulit. Beberapa ide di sini dan di sini.

sebuah contoh

Hingga

  ls -l lrwxrwxrwx 1 admin adm 29 Sep 30 15:28 src/somedir -> /mnt/somedir 

git add/commit/push

 It remains the same 

Setelah git pull dan beberapa pembaruan ditemukan

  drwxrwsr-x 2 admin adm 4096 Oct 2 05:54 src/somedir 
143
02 окт. jawabannya diberikan Shekhar 02 Oktober. 2009-10-02 09:16 '09 pada pukul 09:16 2009-10-02 09:16

Pertanyaan lain tentang tag atau Ajukan Pertanyaan