Xem xét rằng Git không nhận ra các liên kết tượng trưng trỏ ra bên ngoài kho lưu trữ, có vấn đề gì khi sử dụng liên kết cứng không?
Git có thể phá vỡ chúng không? Bạn có thể vui lòng chỉ cho tôi thông tin chi tiết được không?
Xem xét rằng Git không nhận ra các liên kết tượng trưng trỏ ra bên ngoài kho lưu trữ, có vấn đề gì khi sử dụng liên kết cứng không?
Git có thể phá vỡ chúng không? Bạn có thể vui lòng chỉ cho tôi thông tin chi tiết được không?
Câu trả lời:
Đối tượng 'cây', đại diện cho các thư mục trong Git, lưu trữ tên tệp và (tập hợp con của) quyền. Nó không lưu trữ số inode (hoặc loại id tệp khác). Do đó liên kết cứng không thể được đại diện trong git , ít nhất là không phải không có công cụ của bên thứ ba như metastore hoặc git-cache-meta (và tôi không chắc chắn nếu nó có thể ngay cả với những công cụ).
Git cố gắng không chạm vào các tệp mà nó không cần cập nhật, nhưng bạn phải lưu ý rằng git không cố gắng bảo vệ các liên kết cứng, vì vậy chúng có thể bị phá vỡ bởi git.
Về các liên kết tượng trưng trỏ ra bên ngoài kho lưu trữ : git không có vấn đề gì với chúng và nên bảo toàn nội dung của các liên kết tượng trưng ... nhưng tiện ích của các liên kết đó là không rõ ràng đối với tôi, vì liệu các liên kết tượng trưng đó có bị hỏng hay không phụ thuộc vào bố cục hệ thống tệp bên ngoài kho lưu trữ git và không nằm dưới sự kiểm soát của git.
Tôi phát hiện ra rằng, bằng cách sử dụng hook, bạn có thể nắm bắt git pull
sự kiện (khi có thứ gì đó để kéo ...) bằng cách viết trình xử lý sự kiện kịch bản vào .git/hooks/post-merge
tệp.
Đầu tiên, bạn phải có chmod +x
nó.
Sau đó, đặt các ln
lệnh bên trong nó để tạo lại các liên kết cứng ở mỗi lần kéo. Gọn gàng hả!
Nó hoạt động, tôi chỉ cần điều đó cho dự án của mình và ls -i
cho thấy rằng các tệp đã được tự động liên kết sau đó pull
.
Ví dụ của tôi về .git/hooks/post-merge
:
#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf
QUAN TRỌNG: Như bạn có thể thấy, đường dẫn đến bất kỳ tệp nào trong kho lưu trữ của bạn phải bắt đầu bằng $GIT_DIR
, sau đó thêm đường dẫn tương đối một phần vào tệp.
Cũng quan trọng: -f
là cần thiết, vì bạn đang tạo lại tệp đích.
Các điểm nối không phải là liên kết tượng trưng; do đó, các liên kết tượng trưng đơn giản không được hỗ trợ trong msysGit.
Ngoài ra, các liên kết cứng không bao giờ được Git theo dõi .
Vấn đề là theo hướng Windows (vì nó là về msysgit) và tranh luận về khả năng hỗ trợ của liên kết tượng trưng.
Nhưng nhận xét về liên kết cứng liên quan đến Git nói chung.
Google 'git bảo tồn liên kết cứng' và nó cho thấy git không biết cách bảo vệ cấu trúc liên kết cứng AFAIK, có lẽ là do thiết kế.
Các dự án web của tôi sử dụng các liên kết cứng như sau:
www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)
me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
Nếu tôi muốn thay đổi index.php, tôi thay đổi nó ở một nơi và các liên kết cứng (trang chi tiết sản phẩm) trỏ đến các thay đổi - ngoại trừ git không bảo toàn mối quan hệ này trong quá trình nhân bản và kéo trên các máy tính khác.
me@server:www$ git pull
trên một máy khác sẽ tạo một index.php mới cho mỗi liên kết cứng.
hardlink --ignore-time
về /var/lib/jenkins
, để đòi lại một số không gian đĩa. Trong ngày, một số tệp được hủy liên kết lại sau đó git pull
hoặc mvn compile
nhưng điều đó không sao, tôi hy vọng điều đó sẽ xảy ra. Nếu git để duy trì các liên kết cứng, thì chiến lược tái chế dung lượng đĩa của tôi sẽ không hoạt động.