Câu hỏi Làm thế nào để git nhận thấy một nội dung của repo thay đổi?


Nếu bạn sửa đổi một tập tin sạch trước đó, thông báo git. Nó thậm chí làm như vậy nếu bạn thiết lập dữ liệu sửa đổi của tập tin đó trở lại những gì nó trước đây. Tuy nhiên, git không đọc dữ liệu của tất cả các tệp được theo dõi trong thư mục làm việc. Nó không thể làm bởi vì đó là cách quá nhanh. Tôi có nhiều kích thước GB và git status là siêu nhanh, cách nhanh để đọc tất cả dữ liệu trong repo.

  • Làm thế nào để git làm điều này?
  • Làm thế nào người ta có thể làm cho git kiểm tra nội dung của mỗi tập tin được theo dõi để xác minh họ đã không bị hỏng vì họ cuối cùng đã được cam kết? Tốt hơn là không kiểm tra nội dung của repo ở một vị trí khác và yêu cầu một công cụ khác về sự khác biệt có thể có trong các thư mục làm việc.

Để hiểu rõ hơn về những gì không thể xảy ra (loại trừ một vài tùy chọn), tôi đã thực hiện thí nghiệm này: Tôi đã tạo một hệ thống tệp bên trong một tệp và sao chép tài liệu của tôi repo (3 GB tệp được theo dõi) tại đó. Sau đó, tôi unmounted nó, mở tập tin hệ thống tập tin được lưu trữ trong một trình soạn thảo hex, tìm kiếm từ "bất kể" và hoán đổi một sự xuất hiện của nó ra cho từ "không ngừng" (số lượng bằng không gian lưu trữ cần thiết để tôi don 't mess bố trí lên).

Sau đó tôi gắn hệ thống tập tin một lần nữa và chắc chắn đủ, git đã không nhận thấy một cái gì đó thay đổi. Tôi đảm bảo rằng tệp tôi đã thực hiện thay đổi được theo dõi bằng cách mở tệp và tìm kiếm từ "không ngừng". Trên thực tế, lần đầu tiên tôi đổi từ trong tệp sao lưu (*~ và tôi không theo dõi chúng. Nhưng lần thứ hai thay đổi xảy ra trong một tệp được theo dõi.

Ngay cả sau khi tôi đã xem tệp (vì vậy dấu thời gian truy cập của họ bị thay đổi), git không nhận thấy sự thay đổi. Nếu đây là một tham nhũng vì một tia vũ trụ tấn công vào ổ đĩa cứng của tôi và thay đổi từ "bất kể" trong sự xuất hiện của từ "không ngừng", tôi sẽ làm thế nào để nhận ra điều này cho tôi?


1
2018-01-03 23:01


gốc


“Nó không thể làm bởi vì đó là cách quá nhanh.” Đôi khi. tôi đã làm git status trên các kho tương đối nhỏ và quá trình bị treo. - JakeGould
tôi đã làm git status trên repos> 50 GB được lưu trữ trên ổ cứng ngoài được kết nối qua USB và lệnh được trả về trong vòng một giây. tôi làm git status hàng ngày trên repo tài liệu của tôi hiện đang lưu trữ 3 GB dữ liệu được theo dõi trong cây đang hoạt động. Cấp, tôi sử dụng một SSD nhưng SSD đọc với ít hơn 600 MB / s và lệnh chắc chắn không mất 5 giây để trở về. Nó trở lại sau một giây. Ngay lập tức, đối với một con người, mặc dù time đo lường như sau: real 0m0.032s; user 0m0.008s; sys 0m0.028s (Tôi trao đổi các ngắt dòng cho dấu chấm phẩy.) Tuy nhiên, cách dưới 6 s. - UTF-8
Nếu Git tương tác với hệ thống tệp, nó có thể nhanh chóng phát hiện tệp nào được đánh dấu là "đã thay đổi" hoặc "đã sửa đổi" hoặc thậm chí là "mới" qua inodes và sau đó thực hiện kiểm tra MD5 nhanh chóng trên các tệp để xem nội dung được thay đổi. Cấp, điều này không hoàn toàn yếu tố trong các tập tin lớn nhưng có vẻ như đó có thể là trường hợp ở đây. - JakeGould
@JakeGould Git không sử dụng md5. Nó sử dụng sha1. - UTF-8


Các câu trả lời: