2011-01-31 27 views
44

Điều kỳ lạ xảy ra với kho lưu trữ git của tôi. Khi tôi cố gắng cam kết một cái gì đó trong cửa sổ tra tấn, tôi nhận được tất cả các tập tin từ dự án. Tôi không thể hoàn nguyên chúng, khi tôi kéo từ máy chủ, tôi nhận được fatal: No such ref: HEADfatal: Cannot lock the ref 'HEAD'. Tất cả các chi nhánh địa phương của tôi đều mất tích. Có cách nào để giải quyết vấn đề không?Git 'gây tử vong: Không có tham chiếu như vậy: HEAD'

Đây không phải là cam kết đầu tiên hoặc điều gì đó. Điều này đột nhiên xảy ra.

EDIT:

git branch -a nói: Failed to resolve HEAD as a valid ref

git status in tất cả các file dự án đánh dấu là file mới.

Tôi đã thay đổi tên thư mục lưu trữ trong một thời gian và khi tôi thay đổi lại, mọi thứ không chính xác.

+0

Bạn đã làm gì khi điều này xảy ra? Bạn có thể hiển thị đầu ra của 'git status' và' git branch -a' không? –

+0

Chỉ để tránh mọi nghi ngờ, theo thư mục kho lưu trữ, bạn có nghĩa là thư mục có tên '.git' không? –

+0

Không, thư mục dự án, chứa .git trực tiếp – szaman

Trả lời

64

Bạn đã mất HEAD để bạn sẽ cần tạo lại. Điều đơn giản nhất để làm là điều này.

echo ref: refs/heads/master >.git/HEAD 

Bây giờ bạn sẽ có thể chạy các lệnh git khác và xem bạn đang ở đâu.

(Mặc dù, về mặt lý thuyết, bạn có thể cố gắng làm phiên bản git git symbolic-ref HEAD refs/heads/master mới không nhận ra một .git như một kho git trừ khi nó đã có chứa một HEAD vì vậy đây sẽ không làm việc để tạo ra một cái mới.)

+1

Ok, tôi đã làm như bạn đã viết. Sau khi echo tôi ở trên nhánh master, tôi đã thực hiện cam kết và có thể chuyển sang nhánh chính của mình. Nhưng bây giờ khi tôi cố gắng chuyển sang bất kỳ chi nhánh địa phương nào của tôi, tôi nhận được 'error: pathspec' 812 'không khớp với bất kỳ tập tin nào đã biết đến git.' – szaman

+1

@szaman: Tôi không biết nhưng có vẻ như thiếu 'HEAD' không phải là thứ duy nhất bị hỏng trong kho lưu trữ của bạn. Bạn có thể khôi phục nó từ bản sao lưu hoặc sao chép lại không? –

+0

Tôi đã giải quyết nó ... gần. Sau khi tôi áp dụng mẹo của bạn, tôi đã xem nhật ký repo. Chỉ có cam kết cuối cùng mất tích, vì vậy tôi đã tạo chi nhánh mới dựa trên 812 cuối cùng mà tôi đã tìm thấy. Bây giờ tôi có thể chuyển sang nó. Các tập tin từ lần commit cuối cùng tôi có thể lấy từ bản sao của kho lưu trữ bị hỏng, bởi vì tôi đã làm việc trên 812 khi vụ tai nạn này xảy ra. Cảm ơn rất nhiều vì đã giúp đỡ – szaman

6

HEAD thường là tham chiếu đến một nhánh cụ thể; trong trường hợp của bạn, có vẻ như các con trỏ nhánh đã bị mất tích, vì vậy tham chiếu HEAD không thể được giải quyết.

Bạn có thể sử dụng git fsck --lost-found để quét bộ nhớ cache đối tượng cho các đối tượng không thể truy cập; cụ thể, bạn quan tâm đến các cam kết, sau đó có thể được tìm thấy bên dưới .git/lost-found/commit/; đây là những con trỏ đến các nhánh của bạn, tất cả những gì bạn cần làm sau đó là tìm ra cái nào và tạo các tham chiếu mới bằng cách sử dụng git branch.

+0

khi tôi gõ git fsck Tôi gặp lỗi HEAD không hợp lệ – szaman

+0

Bạn có sử dụng tùy chọn '--lost-found' không? –

+0

Có, tôi đã sử dụng nó :) – szaman

6

Tôi nghĩ câu trả lời này có thể hữu ích cho ai đó. Tôi đã giải quyết vấn đề này gần. Đầu tiên tôi đã làm như vậy, giống như Charles Bailey đã viết, sử dụng

echo ref: refs/heads/master >.git/HEAD 

Sau đó, chi nhánh của tôi đã thay đổi thành thạo. Tôi cam kết thay đổi và có thể chuyển sang nhánh chính của mình. Vấn đề là tôi không thể sử dụng bất kỳ chi nhánh địa phương nào của tôi. Đặc biệt là tôi muốn làm việc trên nhánh 812. Vì vậy, tôi đã tìm thấy cam kết cuối cùng với nhánh 812 (tạo thông điệp khi commit rất hữu ích;)) và chuyển sang nó. Tiếp theo tôi tạo chi nhánh 812 dựa trên cái mà tôi đã chuyển sang. Rất tiếc, một số tệp bị thiếu. May mắn thay tôi đã có chúng trên repo bị hỏng mà tôi đã sao chép trước khi 'echo'

2

Đối với tôi vấn đề là trên Mac OS X hoặc cờ 'uchg' hoặc 'uappnd' đã được đặt, khóa một số tệp git bất kể perm . Tôi đặt lại các chflags như thế này và nó giải quyết nó cho tôi:

sudo chflags -R 0000 . 
+0

Tôi cũng có vấn đề về quyền trên Linux. –

+0

vâng, GNU/Linux sẽ tôn trọng các chflags khi nó gắn kết HFS + –

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