Git và liên kết cứng


91

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?


2
Bạn đang cố gắng làm gì và tại sao? Một liên kết cứng không khác gì một tệp bình thường. Nếu bạn đã từng lấy một phiên bản mới từ một kho lưu trữ khác, nó sẽ ghi đè lên phiên bản bạn đã có - điểm liên kết với thứ gì đó bên ngoài kho lưu trữ là gì?
Carl Norum

1
Git sẽ nhận ra các liên kết tượng trưng trỏ đến một đường dẫn bên ngoài kho lưu trữ.
mipadi

Không mipadi, cách duy nhất là vẫy các file trong repo và các liên kết symjbolic trong "thực" các vị trí của họ
Alfredo Palhares

Câu trả lời:


84

Đố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.


4
Các liên kết tượng trưng đến các đường dẫn bên ngoài repo có thể hữu ích. Tôi đã sử dụng chúng trong các ứng dụng web để trỏ đến cơ sở dữ liệu hoặc tệp phương tiện không được repo theo dõi. Bằng cách đó, tệp cấu hình của ứng dụng web có thể trỏ đến một đường dẫn tĩnh, nhưng vị trí thực của đường dẫn đó có thể khác nhau giữa môi trường máy chủ và phát triển cục bộ.
mipadi

@mipadi: BTW. Gitweb hiện đại có trường hợp đặc biệt để hiển thị các liên kết tượng trưng dẫn đầu sau khi chuẩn hóa bên ngoài kho lưu trữ.
Jakub Narębski

6
Đúng vậy, các liên kết biểu tượng bên ngoài repo vẫn ổn. Tôi đã sử dụng chúng để trỏ đến một thư mục dữ liệu lớn mà tôi không cần (hoặc muốn) phiên bản. Nói chung tôi sử dụng liên kết tương đối. Vì vậy, trong trường hợp có thể repo và thư mục dữ liệu phải nằm cạnh nhau trong một số thư mục mẹ. Bạn có thể thực hiện những thủ thuật tuyệt vời với một liên kết tượng trưng để ../foo.
Adrian Ratnapala

Thật không may, Git kho cho metastore (git: //git.hardeman.nu/metastore.git) là không còn nữa.
Derek Mahar

1
github.com/danny0838/git-store-meta là một giải pháp thay thế cho git-cache-meta .
Derek Mahar

21

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 pullsự 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-mergetệp.

Đầu tiên, bạn phải có chmod +xnó.

Sau đó, đặt các lnlệ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 -icho 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: -flà cần thiết, vì bạn đang tạo lại tệp đích.


11
Vì vậy, có vẻ như mỗi lần bạn thêm liên kết cứng vào kho lưu trữ của mình, bạn cũng cần thêm một dòng theo cách thủ công vào tập lệnh hook sau hợp nhất của mình. Sẽ rất tuyệt nếu hook pre-commit của bạn thực hiện điều này hoàn toàn tự động - phát hiện các liên kết cứng (và tượng trưng) trong commit của bạn và viết các dòng thích hợp vào tệp sau hợp nhất của bạn. Git sẽ không phải lưu trữ thông tin inode trong repo, nó sẽ lưu trữ các bit của nó trong hooks! Nhưng thật là lộn xộn nếu tệp được liên kết được theo dõi trong một git repo khác ... liệu một bản chỉnh sửa đối với tệp ở một nơi sẽ truyền sang repo khác một cách suôn sẻ? Hợp nhất vĩnh viễn với một vòng đẩy / kéo tròn?
hobs

Cách tiếp cận thông minh, nhưng thật không may là Git không theo dõi các liên kết cứng, thậm chí có khả năng biểu thị chúng dưới dạng bản sao trên các hệ thống tệp không hỗ trợ liên kết cứng.
Derek Mahar

8

Từ vấn đề msysgit này

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.


2

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.


7
Bạn nên triển khai một số loại định tuyến trong ứng dụng web của mình. Liên kết cứng là kỳ lạ.
Nowaker

5
Vâng, ít nhất hãy sử dụng các liên kết tượng trưng. :)
Andres Riofrio

2
Đây thực sự là những gì tôi muốn, tôi không muốn git bảo tồn các liên kết cứng. Tôi có một thư mục Jenkins với hàng tấn thư mục không gian làm việc, và do các đường ống đa nhánh, có rất nhiều sự trùng lặp. Vì vậy, tôi có một công việc ban đêm mà chạy hardlink --ignore-timevề /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 pullhoặc mvn compilenhư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.
Amedee Van Gasse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.