Git cam kết mạnh mẽ như thế nào khi mất điện?


24

Một ngày nọ tôi đang sử dụng Git (tôi vẫn đang sử dụng nó) và điện bị tắt trong khi tôi đang cam kết.

Khi tôi (thực sự, điện) trở lại, repo git đã bị hỏng. Tôi không nhớ tên chính xác, nhưng nó là một cái gì đó như "refs không hợp lệ" hoặc đại loại như thế.

Thật dễ dàng để đoán rằng cam kết đã bị hỏng ở giữa hoạt động (Tôi đã cam kết thông qua IntelliJ, chỉ số này tự động bổ sung). Thật dễ dàng để đoán rằng, trên thực tế, 'commit' không phải là ACID như hoạt động DBMS có cùng tên.

Q : Có cách nào để đảm bảo các hoạt động thay đổi repo tôn trọng tính nguyên tử không? tức là nếu điện bị tắt lần nữa và tôi cam kết, tôi muốn hệ thống tập tin của mình không ở trạng thái hỏng.


10
Mua một UPS? .....
Robert Harvey

tạo bản sao lưu hàng ngày?
ratchet freak

Nó không giải quyết được vấn đề - hãy tưởng tượng git repo ở trên máy chủ và tôi PUSH từ một repo cục bộ, và trong khi đồng hóa cam kết trong máy chủ, năng lượng lại giảm xuống. Vấn đề tương tự nhưng lần này không có sự hiện diện của con người.
Luis Masuelli

Câu trả lời:


10

Tôi không biết có cách nào để cam kết Git tồn tại khi mất điện hoàn toàn theo thời gian hay không, nhưng bạn có thể sửa chữa kho lưu trữ của mình.

Các đối tượng Git được coi là bất biến, vì vậy tất cả các cam kết cũ của bạn vẫn còn hiệu lực. Theo câu trả lời này , bạn có thể thay đổi hàm băm .git/refs/heads/<branch-name>để thay đổi phần đầu của nhánh bạn đang làm việc với cam kết trước đó (bạn có thể thấy chúng trong .git/logs/HEAD).

Nhận xét cho câu trả lời đó nói rằng phương pháp này "Vẫn để kho lưu trữ ở trạng thái bị hỏng, nhưng điều này cho phép khôi phục nó". Tôi đã không kiểm tra điều này (không biết làm thế nào để sao chép tình huống của bạn), nhưng tôi cho rằng việc khôi phục được thực hiện thông qua git gc, điều đó sẽ xóa cam kết bị hỏng.


6
"Không biết làm thế nào để tái tạo tình huống của bạn" Kéo phích cắm? ;)
yannis

3
@YannisRizos Có thể nếu đây là SVN, nhưng Git cam kết quá nhanh so với khả năng định thời của con người ...
Idan Arye

5
Git là nguồn mở, phải không? Vì vậy, để tái tạo vấn đề, xây dựng mã, đặt điểm dừng trước khi dữ liệu được lưu vào đĩa - và sau đó rút phích cắm.
John Saunders

10

Hệ thống lưu trữ của Git không phải là giao dịch, vì vậy chắc chắn có khả năng sự cố phần cứng có thể khiến mọi thứ ở trạng thái không nhất quán. Mặt khác, Git cũng rất nhanh, do đó bạn phải thực sự không may mắn khi gặp phải các vấn đề về sự cố mất điện của loại Cameron (vấn đề hệ thống với đĩa là một thứ khác). Tốc độ đến một phần chính xác từ thực tế rằng nó không phải là giao dịch; giao dịch thực sự khá tốn kém vì họ phải chờ xác nhận lại từ đĩa mà nó đã ghi dữ liệu. (Cơ sở dữ liệu làm tất cả mọi thứ để cố gắng che giấu chi phí này, nhưng cuối cùng họ vẫn phải trả giá. Một số đối thủ cạnh tranh DVCSes giao dịch, và có, họ đang khá chậm hơn một chút trên phần cứng tương tự như git.)

Trong trường hợp xấu nhất - lỗi đĩa hoàn toàn thảm khốc (mà tôi đã thấy xảy ra) - cách duy nhất để mọi DVCS phục hồi là sử dụng thực tế là nó được phân phối. Nếu bạn đã đẩy các thay đổi của mình cho đến gần đây cho một hệ thống khác và họ đã chia sẻ chúng với nhiều máy chủ khác nhau, thì việc khôi phục chỉ là vấn đề sử dụng một trong những nơi khác này làm nguồn chính xác, là nơi để kéo các chi nhánh của bạn từ ( ngay cả khi chỉ là tạm thời). Như thế bạn sẽ kéo lịch sử của các chi nhánh thú vị trở lại và bạn sẽ có thể làm việc lại rất nhanh; bất cứ điều gì xóa sạch nhiều bản sao phân tán của repo của bạn cùng một lúc đều là một thảm họa mà bạn không lo lắng về lập trình sau đó (nghĩ rằng tác động của thiên thạch lớn) hoặc là hành động hoàn toàn của kẻ thù. (Cố gắng không tạo ra kẻ thù như vậy) Điều này hoàn toàn trái ngược với các hệ thống không được phân phối, trong đó việc mất máy chủ trung tâm lưu trữ mọi thứ là một đòn chí mạng.


5
Nếu bạn không đẩy chi nhánh của mình, đừng giữ các bản sao lưu và không phải là UPS, bạn chỉ có thể tự trách mình nếu các vấn đề về phần cứng xóa sạch tất cả. Bạn đã có các công cụ đào
Donal Fellows

1
Không có cách nào hoặc plugin để đảm bảo hoạt động của git là giao dịch? Nếu tùy chọn này - hoặc plugin tồn tại, tôi sẽ không quan tâm đến việc chúng (tức là hoạt động) chậm hơn. May mắn là tôi không có vấn đề về phần cứng. Thật không may, năng lượng bị tắt thường xuyên (nói rằng cứ hai tuần một lần lại có sự hiện diện của chính nó) trong tòa nhà này và tôi đang mã hóa toàn bộ thời gian và không phải là UPS. May mắn thay tôi đã từ xa (nhân bản / đẩy) nó vào github. Thật không may, tôi mất một thời gian khi phải cuộn lại mọi thứ và sao chép lại dự án.
Luis Masuelli

2
Mất điện thường xuyên trong khi làm việc có nghĩa là bạn thực sự làm tăng nguy cơ tham nhũng hệ thống tập tin, nếu không làm hỏng phần cứng. Tôi sẽ tự hỏi tại sao bạn không giải trí với ý tưởng có được một UPS, điều này sẽ giải quyết hầu hết các vấn đề được mô tả mà bạn gặp phải và có lẽ sẽ là câu trả lời tốt nhất.
Bart Silverstrim
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.