Jika saya memiliki file atau direktori yang merupakan tautan simbolik dan saya komit ke repositori Git, apa yang terjadi padanya?
Saya akan berasumsi bahwa itu meninggalkannya sebagai tautan simbolis sampai file dihapus dan kemudian jika Anda menarik file kembali dari versi lama itu hanya membuat file normal.
Apa yang dilakukan ketika saya menghapus file yang dirujuk? Apakah itu hanya melakukan tautan yang menggantung?
git
version-control
symlink
Alex
sumber
sumber
.gitignore
melihat symlink sebagai file, bukan folder.../..
sesuai kebutuhan.git pull
membuat file alih-alih symlink, coba jalankan klien Git Anda sebagai administrator.Jawaban:
Git hanya menyimpan konten tautan (yaitu jalur dari objek sistem file yang ditautkannya) dalam 'gumpalan' seperti halnya 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 checkout pohon yang berisi tautan, itu mengembalikan objek sebagai symlink terlepas dari apakah objek sistem file target ada atau tidak.
Jika Anda menghapus file yang dirujuk symlink, itu tidak memengaruhi symlink yang dikontrol Git. Anda akan memiliki referensi yang menggantung. Terserah kepada pengguna untuk menghapus atau mengubah tautan untuk menunjuk ke sesuatu yang valid jika diperlukan.
sumber
core.symlinks
variabel konfigurasi menjadi false, dan symlink akan diperiksa sebagai file teks biasa berukuran kecil yang berisi teks tautan.symlinks = false
mengacaukannya.Anda dapat mengetahui apa yang Git lakukan dengan file dengan melihat apa yang dilakukannya ketika Anda menambahkannya ke indeks. Indeks seperti pra-komit. Dengan indeks yang dikomit, 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 mengetahuinya, pertama, buat tautan simbolik:
Git belum tahu tentang file ini.
git ls-files
memungkinkan Anda memeriksa indeks Anda (-s
hasil cetakstat
seperti):Sekarang, tambahkan konten tautan simbolik ke toko objek Git dengan menambahkannya ke indeks. Ketika Anda menambahkan file ke indeks, Git menyimpan kontennya di toko objek Git.
Jadi, apa yang ditambahkan?
Hash adalah referensi ke objek dikemas yang dibuat di toko objek Git. Anda bisa memeriksa objek ini jika Anda mencari di
.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
root repositori Anda. Ini adalah file yang disimpan Git di repositori, yang nanti bisa Anda periksa. Jika Anda memeriksa file ini, Anda akan melihatnya sangat kecil. Itu tidak menyimpan konten file yang ditautkan.(Catatan
120000
adalah mode yang tercantum dalamls-files
output. Ini akan menjadi sesuatu seperti100644
untuk file biasa.)Tapi apa yang dilakukan Git dengan objek ini ketika Anda memeriksanya dari repositori dan ke sistem file Anda? Itu tergantung pada
core.symlinks
konfigurasi. Dariman git-config
:Jadi, dengan tautan simbolik dalam repositori, saat checkout Anda mendapatkan file teks dengan referensi ke path sistem file lengkap, atau tautan simbolik yang tepat, tergantung pada nilai
core.symlinks
konfigurasi.Bagaimanapun, data yang dirujuk oleh symlink tidak disimpan dalam repositori.
sumber
Direktori yang dikaitkan:
Penting untuk mencatat apa yang terjadi ketika ada direktori yang merupakan tautan lunak. Setiap Git pull dengan pembaruan menghapus tautan dan menjadikannya direktori normal. Inilah yang saya pelajari dengan cara yang sulit. Beberapa wawasan di sini dan di sini.
Contoh
Sebelum
git add/commit/push
Setelah
git pull
DAN beberapa pembaruan ditemukansumber