Bạn có thể tìm hiểu những gì Git làm với một tệp bằng cách xem những gì nó làm khi bạn thêm nó vào chỉ mục. Các chỉ số giống như một cam kết trước. Với chỉ mục đã cam kết, bạn có thể sử dụng git checkout
để đưa mọi thứ trong chỉ mục trở lại thư mục làm việc. Vậy, Git làm gì khi bạn thêm một liên kết tượng trưng vào chỉ mục?
Để tìm hiểu, đầu tiên, tạo một liên kết tượng trưng:
$ ln -s /path/referenced/by/symlink symlink
Git chưa biết về tập tin này. git ls-files
cho phép bạn kiểm tra chỉ mục của bạn ( đầu ra giống như -s
in stat
):
$ git ls-files -s ./symlink
[nothing]
Bây giờ, thêm nội dung của liên kết tượng trưng vào kho đối tượng Git bằng cách thêm nó vào chỉ mục. Khi bạn thêm một tệp vào chỉ mục, Git lưu trữ nội dung của nó trong kho đối tượng Git.
$ git add ./symlink
Vì vậy, những gì đã được thêm vào?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Hàm băm là một tham chiếu đến đối tượng được đóng gói đã được tạo trong kho đối tượng Git. Bạn có thể kiểm tra đối tượng này nếu bạn tìm .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
trong thư mục gốc của kho lưu trữ. Đây là tệp mà Git lưu trữ trong kho lưu trữ, mà sau này bạn có thể kiểm tra. Nếu bạn kiểm tra tệp này, bạn sẽ thấy nó rất nhỏ. Nó không lưu trữ nội dung của tập tin được liên kết.
(Lưu ý 120000
là chế độ được liệt kê trong ls-files
đầu ra. Nó sẽ giống như 100644
một tệp thông thường.)
Nhưng Git làm gì với đối tượng này khi bạn kiểm tra nó từ kho lưu trữ và vào hệ thống tập tin của bạn? Nó phụ thuộc vào core.symlinks
cấu hình. Từ man git-config
:
core.symlinks
Nếu sai, các liên kết tượng trưng được kiểm tra dưới dạng các tệp đơn giản nhỏ có chứa văn bản liên kết.
Vì vậy, với một liên kết tượng trưng trong kho lưu trữ, khi thanh toán, bạn có thể nhận được một tệp văn bản có tham chiếu đến đường dẫn hệ thống tệp đầy đủ hoặc một liên kết tượng trưng thích hợp, tùy thuộc vào giá trị của core.symlinks
cấu hình.
Dù bằng cách nào, dữ liệu được tham chiếu bởi symlink không được lưu trữ trong kho lưu trữ.
.gitignore
thấy symlink như một tập tin chứ không phải một thư mục.