2012-06-07 49 views
7

Tôi đã gặp khó khăn với một số vấn đề về kết thúc dòng khoảng 20 cam kết và một số điều kỳ lạ đã xảy ra. Bây giờ git chương trình fsck:cây git chứa các mục nhập tệp trùng lặp

Checking object directories 100% (256/256), done. 
error in tree ee2060e71cb36d33be5ddc1fe9ca8d7dd0ab35cd: contains duplicate file entries 
Checking objects: 100% (8633/8633), done. 

và git chương ee2060 cho thấy:

File1.cs 
File2.cs 
File2.cs 
File2.cs 
File3.cs 

này được ngăn chặn tôi từ đẩy từ xa của tôi. git push hiển thị:

error: unpack failed: index-pack abnormal exit 
To https://github.com/username/Project.git 
! [remote rejected] master -> master (n/a (unpacker error)) 
error: failed to push some refs to 'https://github.com/username/Project.git' 

Tôi đã thử đóng gói lại và thu gom rác. Làm thế nào tôi có thể giải quyết vấn đề này?

Trả lời

4

cuối cùng tôi đã cố định các repo bằng cách làm như sau

  1. làm một bản sao tươi từ github, mà chỉ bao gồm các cam kết trước khi vấn đề xảy ra
  2. thêm sai lầm repo của tôi từ hệ thống tập tin như một điều khiển từ xa trên mới bản sao
  3. cẩn thận kiểm tra cam kết từ repo xấu vào bản sao làm việc của bản sao mới

    git checkout fe3254FIRSTCOMMITAFTERORIGIN/MASTER/HEAD . // note the dot at the end 
    // without the dot, you move your head to the commit instead of the commit 
    // to the working copy, and seems to bring the corrupt object into your good clone 
    
  4. commi t mỗi lần lượt, tự sao chép các cam kết thông báo từ repo khác
  5. loại bỏ các repo tham nhũng từ điều khiển từ xa
  6. rác thu thập + prune

    git gc --aggressive --prune=now 
    
  7. khóc hạnh phúc như git fsck cho thấy không có mục tập tin trùng lặp
+0

Tại sao đề xuất - vi phạm? Điều duy nhất nó làm là bỏ qua tất cả các thông tin đồng bằng thu thập trước đó. Thông tin thêm: http://metalinguist.wordpress.com/2007/12/06/the-woes-of-git-gc-aggressive-and-how-git-deltas-work/ – riezebosch

+0

@riezebosch Tôi không nhớ tại sao Tôi đã bao gồm - tích cực hoặc có cần thiết để khắc phục sự cố không. –

+1

Được rồi, tôi có thể tưởng tượng nó là cần thiết để xây dựng lại hoàn toàn tất cả các vùng đồng bằng để loại bỏ các cam kết lơ lửng. – riezebosch

0

Việc xóa lại các cam kết của bạn có thể khắc phục được. Nếu điều đó không giúp được thì bạn có thể sử dụng lệnh git low-level (git-cat-file) để xem những gì commit chứa đối tượng cây lạ này, và tái tạo lại ở đó một phiên bản đúng của cây mà không có bản sao. Tuy nhiên, tôi không biết về bất kỳ công cụ tự động nào có thể sửa lỗi này, và có thể bạn sẽ phải thay đổi tất cả cây và đối tượng cam kết đã liên kết với một đối tượng lạ.

Nhân tiện, git ls-tree ee2060 sẽ cho bạn biết thêm chi tiết về dữ liệu trong cây bị hỏng, chẳng hạn như các tệp được tham chiếu tại đó.

1

thanh toán chi nhánh mới ngay trước cam kết có vấn đề. bây giờ kiểm tra các tập tin từ các cam kết có vấn đề. Bây giờ hãy thêm và cam kết sử dụng cùng một thông báo (sử dụng tùy chọn -C). Lặp lại cho phần còn lại của các cam kết. Sau khi bạn hoàn tất, hãy đặt lại nhánh khác để trỏ đến điểm chính xác này. Sau đó bạn có thể đẩy.

+0

Ok, tôi đã kiểm tra trước khi sự cố và chọn lại các cam kết theo thứ tự, bỏ qua các cam kết xấu và tôi đặt lại chính thành nhánh mới. Tuy nhiên, git fsck vẫn hiển thị các mục trùng lặp, ngay cả sau khi thử mọi thứ tôi có thể nghĩ đến để cắt tỉa, v.v. Kiểm tra tính chính xác, tôi đã kiểm tra trước khi vấn đề được giới thiệu và xóa tất cả các cam kết sau đó. Vấn đề vẫn còn đó. Vì vậy, tôi đã viết một kịch bản bash để đệ quy tìm kiếm cây cam kết để tìm cây xấu, và nó không được tham chiếu bởi bất kỳ người trong số họ. Có cách nào để có được git prune prune unreferenced đối tượng mà tôi không biết về? –

+0

miễn là bạn không có tham chiếu đến các cam kết xấu, bạn sẽ có chúng đi. chỉ cần thực hiện một 'git gc --aggressive --prune = now' khi tài liệu tham khảo của bạn được sắp xếp do reflog không còn lưu trữ chúng nữa. –

6

Tôi đã sử dụng git-replace và git-mktree để sửa lỗi này trong quá khứ. Bạn về cơ bản giữ đối tượng cây bị hỏng, nhưng ghi đè lên tất cả các liên kết và làm cho chúng trỏ đến một đối tượng mới.

  1. tiên chúng ta lấy cây xấu: git ls-tree bad_tree_hash > tmpfile.txt này viết ra cây xấu của bạn.Ví dụ:

    040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 → xNotAlphabetic 
    040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb → EXT 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 → ToolTester 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    

    NB, · & → là khoảng trắng [không gian] và [tab]

  2. Tiếp theo, chỉnh sửa văn bản, loại bỏ các dòng vi phạm, và tiết kiệm với kết thúc kiểu Unix (tức là chỉ có LF, chứ không phải CRLF). Với ví dụ này, chúng ta thực hiện điều này:

    040000·tree·4ad0d8ef014b8cc09c95694399254eff43217bfb → EXT 
    040000·tree·d65085e4a05ea9ac8b79e37b87202dd64d402c2e → duplicateFolder 
    040000·tree·fd0661d698ace91135a8473b26707892b7c89c32 → ToolTester 
    040000·tree·3cdcc756ee0ed636c44828927126911d0ab28a18 → xNotAlphabetic 
    
  3. Loại cat tmpfile.txt | git mktree mà sẽ làm cho một đối tượng cây cố định mới và lưu nó, và trả lại băm mới: a55115e4a05ea9ac8b79e37b872024d64d4r2c2e aka cho các mục đích giới thiệu new_tree_hash

  4. Tiếp theo git replace sẽ tạo một tham chiếu mới, điều này buộc tất cả các liên kết sự cố trước đó phải sử dụng đối tượng mới, cố định thay thế. git replace bad_tree_hash new_tree_hash

này sẽ giải quyết vấn đề trước mắt của bạn. Nếu bạn quan tâm, hãy xem liên kết ghi đè trong thư mục .git/refs/replace.


Đối tượng cây xấu sẽ tiếp tục tạo ra những cảnh báo bất cứ khi nào bạn làm một kiểm tra về kho lưu trữ của bạn với git fsck, nhưng nó có thể được bỏ qua, và tất cả các cam kết của bạn và các liên kết khác sẽ phù hợp và làm việc bất kể.

1

Tôi đã gặp vấn đề với ilk này và tất cả các giải pháp ở đây và trong các chủ đề SO khác không thể khắc phục được cho tôi. Cuối cùng tôi đã sử dụng BFG repo cleaner để tiêu diệt tất cả các cam kết tham chiếu đến tên thư mục xấu, có lẽ là quá mức cần thiết nhưng đã sửa thành công repo.

Các vấn đề liên quan