2011-11-25 15 views
32

Kho lưu trữ git của tôi bị hỏng sau một vài lần khởi động lại cứng do các vấn đề về nguồn điện và giờ tôi không thể khắc phục được (Tôi đang ở giữa dàn một số tập tin trong lần mất điện cuối cùng)Sửa kho git bị hỏng

$ git status                               
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git fsck 
fatal: failed to read object 24377c609184c192f3f3c1733bac7115c1080758: Invalid argument 
$ git branch -a 
(...works, lists branches...) 
$ git checkout someotherbranch 
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log            
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument 
$ git log someotherbranch 
(...works, shows commits...) 

Vì vậy, như bạn có thể thấy, nhánh hiện tại của tôi hơi bị xáo trộn và tôi dường như không thể sửa nó. Bất kỳ ideea những gì tôi có thể cố gắng sửa chữa này?

+1

là repo máy chủ này? có tồn tại bản sao địa phương/repos mà bạn có thể sử dụng để phục hồi? – prusswan

+1

Đó là repo git địa phương của tôi ... Tôi có một bản sao trên máy khác mà tôi có thể sử dụng để khôi phục lại mọi thứ (với một vài cam kết bị mất có lẽ), nhưng tôi muốn sửa repo này nếu có thể ... – Unknown

+0

Điều đáng nói đến rằng nội dung thư mục làm việc vẫn có thể phục hồi được. Do 'git diff> diff.patch', sau đó bạn có thể sử dụng nó như thế này để vá một bản sao mới:' git patch -p1 datashaman

Trả lời

5

Hãy thử tạo bản sao lưu của kho lưu trữ và sau đó chạy git reset --hard [email protected]{1} để quay lại trang trước HEAD và xem hoạt động này có hoạt động hay không. Nó có thể chỉ là HEAD hiện tại bị hỏng.

(Bạn cũng nên chạy fsck trên đĩa của bạn nếu bạn chưa có.)

+1

$ git reset --hard HEAD @ {1} Kiểm tra tệp: 100% (5724/5724), đã hoàn tất. gây tử vong: không đọc được đối tượng 3d18855708b0f127d40c13c679559d7679228b69: Đối số không hợp lệ – Unknown

+0

Darn. 'Git reflog' có hoạt động không? –

+1

Không, điều tương tự :($ git reflog gây tử vong: không đọc được đối tượng 3d18855708b0f127d40c13c679559d7679228b69: Đối số không hợp lệ – Unknown

31

Giải pháp của tôi cho một tình huống tương tự là để thay thế một băm của đối tượng bị hư hại trong .git/refs/heads/my-working-branch với một hash của trước đó cam kết (mà có thể được tìm thấy trong .git/logs/HEAD).

+1

Vẫn để lại 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ó. – ony

+5

Tôi không chắc mình hiểu đây là gì –

+0

wow. cái này hoạt động ... cái đầu của tôi đã bị hỏng thành '^ @^@^@^@ ...' hay cái gì đó tương tự. –

9

Đối với tôi, tôi đã bật TRIM trong OSX bằng ổ SSD không phải của Apple (không được khuyến nghị) và dường như đã gây ra nhiều hỏng hóc khác nhau trên đĩa khởi động của tôi. Vì vậy, các cam kết bị hỏng là sâu trong lịch sử.

Tôi không quan tâm quá nhiều đến việc sửa chữa repo của tôi, ngoại trừ tôi có một vài chi nhánh địa phương quá thử nghiệm để làm phiền việc đẩy lùi từ xa, và tôi muốn cứu vãn công việc trong những nhánh đó.

Về mặt lý thuyết, vì đây là một repo địa phương, tôi cảm thấy rằng git sẽ có thể phục hồi/sửa chữa chính nó bằng cách sử dụng nguồn gốc. Tại sao điều này không thể?

Dù sao đi nữa tôi stumbled trên this cool strategy to push a branch to another local git repo. Thật không may, nhân bản các repo vào ../repo_copy và sau đó sử dụng đó như là một từ xa địa phương dẫn đến các lỗi sau:

! git push --force local_remote HEAD 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 
error: failed to push some refs to '/Users/steve/Dev/repo_copy' 

Vì vậy, tôi bắt đầu thay vì với một repo rỗng, sau đó đẩy chi nhánh để nó làm việc OK. Vì vậy, đối với bất kỳ chi nhánh địa phương tôi đã có git log đã không dừng lại ở:

.... 
    Fixing cukes 
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument 

tôi chỉ đơn giản sẽ kiểm tra xem nó ra và sau đó làm git push --force local_remote HEAD. Điều cuối cùng tôi đã làm được:

! cd ~/Dev/repo_copy 
! git remote add origin [email protected]:sdhull/my_repo.git # real remote 

Sau đó, tôi đã đi vào để git config -e và thiết lập chi nhánh chủ của tôi và đã trở lại và chạy với không có gì mất! Hãy cho tôi biết trong phần bình luận nếu bạn muốn biết thêm chi tiết về cách tiếp cận này. Chúc mừng!

14

Điều này đã xảy ra với tôi. Tôi reclone kho lưu trữ trong một thư mục mới và di chuyển các thay đổi mới nhất của tôi trên tay. Công nghệ thấp nhưng hoạt động mọi lúc. Hy vọng rằng bạn có thể nhớ những thay đổi cuối cùng của bạn.

+4

Bạn có thể chỉ cần thay thế thư mục '.git' trong repo bị hỏng bằng thư mục bạn đã kéo lại. Bằng cách đó bạn không cần phải di chuyển các thay đổi của mình theo cách thủ công. Chỉ cần biết về phân nhánh. Bạn có thể phải stash và kiểm tra các chi nhánh chính xác. –

3

tôi đã có thể khôi phục lại repo của tôi từ:

zsh(broken)% git log master 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
error: object file .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395 is empty 
fatal: loose object 7fcab8648a989d9bb3f5246e6be7220395493395 (stored in .git/objects/7f/cab8648a989d9bb3f5246e6be7220395493395) is corrupt 
zsh(broken)% cat .git/refs/heads/master 
7fcab8648a989d9bb3f5246e6be7220395493395 
e311726c4eb970f4d4f504ad86248d322855018f da9c14d03e4849394087b61ff6272399937f7cce Nikolay Orliuk <[email protected]> 1379583764 +0300 commit: plan: timings 

Bằng cách đặt master to prev cam da9c14d03e4849394087b61ff6272399937f7cce như lời kể của @Nash Bridges:

zsh(broken)% echo da9c14d03e4849394087b61ff6272399937f7cce > .git/refs/heads/master 
zsh(broken)% git log --oneline -1 master 
da9c14d plan: timings 
zsh(broken)% git fsck 
Checking object directories: 100% (256/256), done. 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
error: object file .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5 is empty 
fatal: loose object 0eace931fdc851da254e9522596d1517d0ed51c5 (stored in .git/objects/0e/ace931fdc851da254e9522596d1517d0ed51c5) is corrupt 

Tạo repo trống mới, lấy master từ vỡ

zsh(broken)% mkdir ../recover && cd ../recover && git init 
Initialized empty Git repository in /home/nikolay/talks/y/recover/.git/ 
zsh(recover)% git fetch ../broken master 
remote: Counting objects: 44, done. 
remote: Compressing objects: 100% (44/44), done. 
remote: Total 44 (delta 20), reused 0 (delta 0) 
Unpacking objects: 100% (44/44), done. 
From ../broken 
* branch   master  -> FETCH_HEAD 
zsh(recover)% git reset --hard FETCH_HEAD 
HEAD is now at da9c14d plan: timings 
zsh% git fsck 
Checking object directories: 100% (256/256), done. 

Để khôi phục lại thay đổi e rằng đang trên đường để master:

zsh(recover)% rm -rf * && cp -a ../broken/* ./   
zsh(recover)% git add -u && git commit -m 'prepare for publishing' 
1

Tôi làm theo các hướng dẫn tìm thấy here

$ cd /tmp/ 
$ git clone good-host:/path/to/good-repo 
$ cd /home/user/broken-repo 
$ echo /tmp/good-repo/.git/objects/ > .git/objects/info/alternates 
$ git repack -a -d 
$ rm -rf /tmp/good-repo 

Làm việc đối với tôi

1

Giải pháp đơn giản nhất đối với tôi: Bạn có thể git clone trong một thư mục mới, sau đó thay thế new_folder/.git sạch thành thư mục cũ (thư mục bị hỏng). Nó hoạt động tốt cho tôi !

git clone ...(remote) new_folder 
mv old_folder/.git old_folder/.git_old 
cp -R new_folder/.git old_folder/ 

Chúc mừng!

1

Một cách khác mà làm việc đối với tôi là để thiết lập lại các đầu git và chỉ số trạng thái trước đó sử dụng:

git reset --keep

Tôi cũng đã cố gắng các lệnh sau nhưng họ không làm việc cho tôi, nhưng họ có thể cho bạn:

git reset --mixed git fsck --full git gc --auto git prune --expire now git reflog --all