2012-03-31 17 views
57

Gần đây, tôi đã chạy git fsck --lost-found trên kho lưu trữ của mình.git: các đốm lủng lẳng

Tôi dự kiến ​​sẽ thấy một vài cam kết lơ lửng, nơi tôi đã đặt lại HEAD.

Tuy nhiên, tôi đã rất ngạc nhiên khi thấy có khả năng hơn vài nghìn tin nhắn blob lúng túng.

Tôi không tin điều gì là sai với kho lưu trữ của mình, nhưng tôi tò mò về nguyên nhân gây ra những đốm màu lơ lửng này? Chỉ có hai người làm việc trên kho lưu trữ, và chúng tôi đã không làm bất cứ điều gì ngoài bình thường. Tôi không nghĩ rằng chúng được tạo ra bởi một phiên bản cũ hơn của một tập tin được thay thế bằng một phiên bản mới, vì git sẽ cần phải giữ cả hai đốm màu để nó có thể hiển thị lịch sử.

Hãy suy nghĩ về điều đó, tại một thời điểm chúng tôi đã thêm một thư mục RẤT lớn (hàng nghìn tệp) vào dự án do nhầm lẫn và sau đó xóa nó. Đây có phải là nguồn gốc của tất cả các đốm màu lơ lửng không?

Chỉ cần tìm kiếm thông tin chi tiết về bí ẩn này.

Trả lời

49

Thời gian qua tôi nhìn này, tôi tình cờ this thread, đặc biệt là phần này:

Bạn cũng có thể kết thúc với treo lủng lẳng các đối tượng trong gói. Khi gói đó được đóng gói lại, những đồ vật đó sẽ được nới lỏng, và sau đó cuối cùng hết hạn theo quy tắc được đề cập ở trên. Tuy nhiên, tôi tin gc sẽ không luôn luôn đóng gói lại các gói cũ; nó sẽ làm cho gói mới cho đến khi bạn có rất nhiều gói, và sau đó kết hợp tất cả (ít nhất đó là những gì "gc --auto" sẽ làm; I không nhớ liệu "git gc" có tuân thủ cùng một quy tắc hay không).

Vì vậy, đó là hành vi bình thường và không được thu thập sau cùng, tôi tin.

chỉnh sửa: mỗi Daniel, bạn có thể ngay lập tức thu thập nó bằng cách chạy

git gc --prune="0 days" 
+3

gì sẽ xảy ra nếu những blob là loại bỏ? – nferocious76

+0

@ nferocious76 sau đó bạn không thể cứu vãn các tệp, ví dụ, được thêm vào dàn dựng nhưng không được cam kết, và sau đó được loại bỏ (qua rm -f). Một khi GC đã chạy các tập tin bị mất cho tốt. –

+0

@DavidBrower Tôi thấy cảm ơn bạn. Vì vậy, nó cũng loại bỏ các tập tin unlinked hoặc unreferenced. – nferocious76

16

Bất cứ khi nào bạn add một tập tin vào chỉ số, nội dung của tập tin đó được bổ sung vào cơ sở dữ liệu đối tượng Git như một blob. Khi bạn sau đó reset/rm --cached rằng tập tin, các đốm màu vẫn sẽ tồn tại (họ sẽ được thu gom rác thải lần sau khi bạn chạy gc)

Tuy nhiên, khi các tập tin là một phần của cam kết và bạn quyết định sau này để reset lịch sử, sau đó các cam kết cũ vẫn có thể truy cập được từ bản tin của Git và sẽ chỉ được thu gom rác sau một khoảng thời gian (thường là một tháng, iirc). Những đối tượng đó không nên hiển thị như là lúng túng mặc dù, vì chúng vẫn được tham chiếu từ reflog.

+2

Cũng cần lưu ý rằng nếu bạn sửa một tập tin và 'lại' lại, phần trước sẽ trở thành một đốm màu lúng túng theo cùng một cách. (Tôi thường sử dụng trình tự: hack đi, 'git add',' git diff --cached' và/hoặc 'git status' cho đến khi hạnh phúc, sau đó' git commit', vì vậy tôi nhận được rất nhiều trong số này. :-)) – torek

23

tôi đã thực sự mất kiên nhẫn và sử dụng:

git gc --prune="0 days" 
Các vấn đề liên quan