2012-07-22 32 views
15

Một trong kho nhân bản của tôi là nhận được điều này từ một git fsckLàm thế nào để loại bỏ "fatal: loose object"?

fatal: loose object 40bda4e3b79c3d7bf598df31d9e68470f97a3f79 (stored in .git/objects/40/bda4e3b79c3d7bf598df31d9e68470f97a3f79) is corrupt

Tôi đã có một bản sao của nó fsck rằng sạch.

Tôi đã thử nuking thư mục/thư mục con chứa thư mục tử vong và lặp lại. Vấn đề vẫn tiếp tục.

Tôi thực sự không quan tâm đến bất kỳ tệp cụ thể nào, tôi chỉ muốn kho lưu trữ là thanh toán một cách rõ ràng. Tôi làm gì?

Lưu ý: kho lưu trữ từ xa được lưu trữ trên github.

+0

Bạn có thể sao chép kho lưu trữ ban đầu không? –

+0

có thể trùng lặp: http://stackoverflow.com/questions/4254389/git-corrupt-loose-object – tiwo

+0

Cũng http: // stackoverflow.com/questions/8438620/git-pull-fatal-loose-object –

Trả lời

23

Câu trả lời dễ dàng: di chuyển repo cũ ra và lấy lại. Nếu bạn có thứ gì đó trong repo cũ bạn muốn bảo quản, có nhiều cách để lấy chúng, nhưng trước tiên hãy có một repo tốt.

+0

Tôi nuked cấu trúc thư mục/kho lưu trữ và được lặp lại. Vấn đề vẫn tồn tại. Có cách nào khác để "di chuyển" repo cũ đi? – fishtoprecords

+0

@fishtoprecords: 'git fsck' trả về lỗi, đúng không? Sau đó, 'cd ..; mv reponame reponame-fatal-loose-object; git clone URL reponame' –

+0

Cảm ơn, tôi thề rằng tôi đã làm điều đó một lần trước đây, nhưng lần này nó hoạt động tốt. – fishtoprecords

3

Trước tiên, bạn có thể kiểm tra hệ thống tập tin lỗi: fsck -y

Sau đó, kiểm tra các kho git: git fsck

-3

câu trả lời đơn giản nhất là "rm -rf .git ..." http://www.bazhukov.net/2015/02/git-corrupt-loose-object/

+0

liên kết này là tiếng Nga. Tôi không nghĩ rằng bất kỳ anh chàng phần mềm lành mạnh nào cũng có thể sử dụng nó. – user23573

+0

Khi bạn thấy thông báo tham nhũng sử dụng các lệnh này: 1. rm -rf .git 2. git init 3. git remote thêm nguồn gốc repository_address 4. git fetch 5. git reset --hard nguồn gốc/master – bo858585

+4

Hãy DON 'Làm điều đó, hoặc chỉ làm điều đó nếu bạn biết những gì bạn đang nhận được vào. Bước 'reset --hard' cuối cùng sẽ khiến bạn mất mọi thay đổi chưa được cam kết trong kho lưu trữ của mình. – Chaosed0

0

Thực hiện git checkout đến chi nhánh khác, bạn sẽ nhận được danh sách các tệp đã thay đổi, chỉ cần cam kết và đẩy vào nhánh. Nếu bạn thực hiện việc này, sự cố sẽ được giải quyết, lần sau khi bạn thực hiện một số thay đổi, git status sẽ hoạt động.

3

Ý tưởng là:

  1. đầu tiên loại bỏ hồ sơ git hiện tại của bạn mà cư trú tại .git của bạn thuộc dự án hiện tại của bạn (chúng ta hãy biểu thị nó bằng cách "dự án A").
  2. Tạo bản sao của dự án hiện tại của bạn, chúng tôi biểu thị bản sao là "dự án B".
  3. Bây giờ cd vào dự án A và git sao chép và đặt lại cam kết cuối cùng.
  4. Sao chép tất cả các tập tin từ dự án B và thay thế những người trong dự án A.
  5. Bây giờ cd vào dự án A và sử dụng git status để xem tình trạng của dự án A. Nó phải là cũng giống như khi không có tham nhũng xảy ra bao giờ hết.

Tóm lại, tạo bản sao để đặt trước khu vực làm việc hiện tại của bạn và kết hợp với bản sao mới bằng cách thay thế tệp và sau đó xử lý các thay đổi của bạn như bình thường.

Dưới đây là nó trong hành động:

  1. Trước tiên tôi thấy tôi có một tham nhũng (mà là vì tôi buộc máy ảo của tôi để shutdown inproperly ngày hôm qua: P):

    ✘ domicor @ ubuntu  ~/dotfiles   chủ ●  tình trạng git lỗi: đối tượng tập tin .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 trống lỗi: đối tượng tập tin .git/objects/cd/593f6db1d5050406e15b9c80d215fd48db39f4 trống gây tử vong: lỏng lẻo đối tượng cd593f6db1d5050406e15b9c80d215fd48db39f4 (lưu trữ trong.git/đối tượng/cd/593f6db1d5050406e15b9c80d215fd48db39f4) bị hỏng corrupted

  2. Tạo một bản sao của thư mục dotfiles của tôi và bây giờ loại bỏ các thư mục .git.

    $ cd ~/dotfiles $ rm -rf .git

    dotfiles

  3. Sau đó tái tạo một repo git.

    $ git init

  4. Thêm từ xa.

    $ git remote thêm nguồn gốc [email protected]: domicor/dotfiles.git

  5. Fetch từ xa.

    $ git fetch

    Dưới đây là một ảnh chụp màn hình của các lệnh trên: rm-clone-fetch

  6. Bây giờ thiết lập lại các HEAD.

    $ git reset --hard nguồn gốc/master

    Đây là shot: reset

    Chú ý rằng ngay sau khi tôi lấy từ xa tôi đã đưa ra một lệnh git status để kiểm tra trạng thái của repo của tôi. Bạn có thể thấy tất cả các tập tin được untracked. Và phần thứ nhất của dòng lệnh là màu cam từ lệnh git init của chúng tôi tới lệnh git reset chỉ ra rằng khi tôi khởi tạo repo của mình, git phát hiện tệp và sau khi đặt lại, tất cả các tệp được khôi phục về trạng thái HEAD sao cho dấu nhắc màu xanh lá cây.

  7. Đặt chi nhánh thượng nguồn:

    $ git branch --set-thượng nguồn-to = gốc/master chủ

  8. Bây giờ sao chép tập tin của bạn từ thư mục sao lưu (đối với tôi nó là dotfiles (copy)) bằng tay hoặc thông qua dòng lệnh để thay thế tệp trong thư mục dotfiles. Kiểm tra trạng thái và cần có những thay đổi giống như ảnh chụp màn hình của tôi:

    final

  9. Bây giờ bạn có thể git diff your-filename kiểm tra nếu thay đổi của bạn được áp dụng đúng cách và bạn có thể thêm các tập tin và cam kết từ bây giờ. \ o/

Để hiểu điều đó thật thú vị, git VCS chỉ ghi lại các thay đổi của bạn. Khi VCS bị hỏng, các tệp của bạn vẫn an toàn. Họ vẫn ở đó khi bạn rời họ. Vì vậy, bạn sao lưu các tệp và khôi phục bản ghi git từ nơi khác và git có thể so sánh bản sao khôi phục với trạng thái tệp hiện tại của bạn và có ý tưởng về những gì đã thay đổi giống như trước khi tham nhũng. Và chúc mừng \ o/

+0

Cảm ơn bạn, câu trả lời chi tiết của bạn là hữu ích nhất! Tôi đã sử dụng "rsync -ria --progress /* /" 'để sao chép các thay đổi của mình. –

+1

btw - bạn đang sử dụng loại bash-prompt bash-prompt nào ở đây? chỉnh sửa: Tìm thấy nó, Agnoster cho ZSH (https://github.com/agnoster/agnoster-zsh-theme) –

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