Pertanyaan Bagaimana cara git menangani tautan simbolik?


Jika saya memiliki file atau direktori yang merupakan tautan simbolis dan saya menyerahkannya ke git repo apa yang terjadi padanya?

Saya akan menganggap bahwa itu meninggalkannya sebagai tautan simbolis sampai file dihapus dan kemudian jika Anda menarik file kembali dari versi lama hanya menciptakan file normal.

Apa fungsinya ketika saya menghapus file yang dirujuknya? Apakah itu hanya melakukan tautan menjuntai?


1314
2018-06-05 06:53


asal


Jawaban:


git hanya menyimpan isi dari link (yaitu path dari objek sistem file yang terhubung ke) dalam 'blob' seperti itu akan untuk file normal. Kemudian menyimpan nama, mode dan jenis (termasuk fakta bahwa itu adalah symlink) di objek pohon yang mewakili direktori yang berisi.

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

Jika Anda menghapus file yang referensi symlink itu tidak mempengaruhi symlink yang dikendalikan git dengan cara apapun. Anda akan memiliki referensi yang menggantung. Terserah kepada pengguna untuk menghapus atau mengubah tautan untuk menunjukkan sesuatu yang valid jika diperlukan.


1096
2018-06-05 07:01



TL; DR: Data yang direferensikan oleh symlink tidak disimpan dalam repositori.


Anda dapat mengetahui apa yang dilakukan Git dengan file dengan melihat apa yang dilakukannya ketika Anda menambahkannya ke indeks. Indeks itu seperti pra-komit. Dengan indeks yang berkomitmen, Anda dapat menggunakan git checkout untuk membawa semua yang ada di indeks kembali ke direktori kerja. Jadi, apa yang dilakukan Git ketika Anda menambahkan tautan simbolis ke indeks?

Untuk mencari tahu, pertama, buat tautan simbolis:

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

Git belum tahu tentang file ini. git ls-files memungkinkan Anda memeriksa indeks Anda (-s cetakan stat-seperti output):

$ git ls-files -s ./symlink
$

Sekarang, tambahkan konten dari tautan simbolik ke penyimpanan objek Git dengan menambahkannya ke indeks. Ketika Anda menambahkan file ke indeks, Git menyimpan isinya di penyimpanan objek Git.

$ git add ./symlink

Jadi, apa yang ditambahkan?

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

Hash adalah referensi ke objek yang dikemas yang dibuat di toko objek Git. Anda dapat memeriksa objek ini jika Anda melihatnya .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c.

Itu 120000 adalah mode file. Itu akan menjadi sesuatu seperti 100644 untuk file biasa dan merupakan mode khusus untuk tautan. Dari man git-config:

core.symlinks

Jika salah, tautan simbolis diperiksa sebagai file polos kecil yang berisi teks tautan. git-update-index (1) dan git-add (1) tidak akan mengubah tipe rekaman ke file biasa.

Menggunakan git cat-file -p untuk mencetak isinya dengan cantik:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Jadi, itulah yang dilakukan Git pada tautan simbolis: ketika Anda git checkout tautan simbolis, Anda juga mendapatkan file teks dengan referensi ke jalur filesystem lengkap, atau symlink, tergantung pada konfigurasi. Data yang direferensikan oleh symlink tidak disimpan dalam repositori.


151
2017-09-13 17:06



Direktori symlinked:

Penting untuk dicatat apa yang terjadi ketika ada direktori yang merupakan tautan lunak. Setiap git tarik dengan pembaruan menghapus tautan dan menjadikannya direktori normal. Inilah yang saya pelajari dengan cara yang sulit. Beberapa wawasan sini dan sini.

Contoh

Sebelum

 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

139
2017-10-02 06:16