2012-04-13 21 views
50

Khi tôi chạy status git trên repo của tôi tôi nhận được fatal: Not a git repository: /my repo/.git/modules/docstình trạng git trả gây tử vong: Không phải là một kho git nhưng .git tồn tại và TRỤ có quyền truy cập thích hợp

Tôi đã kiểm tra và .git tồn tại và chứa HEAD cùng các hợp quyền. Tôi có thể chạy các lệnh khác tốt. Nếu tôi chạy git gui nó sẽ mở ra tốt và sẽ liệt kê một vài tệp đã thay đổi, nhưng thiếu nhiều tệp.

Tôi đoán có thể có một số loại tham nhũng trong HEAD, không chắc chắn. Bất kỳ ý tưởng làm thế nào để sửa lỗi này mà không xóa toàn bộ repo?

Cập nhật: Tôi nhận ra rằng tôi đã thay đổi tên của thư mục của repo. Thư mục được tham chiếu trong lỗi là tên cũ của thư mục. Vì vậy, repo hiện tại của tôi là /new dir/.git nhưng lỗi là nói Not a git repository: /old dir/.git/modules/docs. Vì vậy, có lẽ git là nhầm lẫn?

+0

Bạn đang lồng các kho lưu trữ git? – nes1983

+0

@ nes1983 Tôi có một số mô-đun con, tuy nhiên vấn đề này là với repo chính. –

Trả lời

7

Cuối cùng tôi đã sắp xếp ra rằng vấn đề là do sự cố với một trong các mô-đun con. Đơn giản chỉ cần đổi tên thư mục repo gây ra một cuộc xung đột với submodule đó. Sau khi nhìn thấy các cuộc thảo luận trong How can I rename a git repository with submodules? tôi nhận ra rằng nhân bản repo là một cách tốt hơn để đi thay vì đổi tên thư mục và giải quyết vấn đề với submodule.

+0

Việc khôi phục từ sự cố này chỉ mất hai chỉnh sửa thủ công nhỏ trên mỗi mô-đun con. Đối với tôi đó là dễ dàng hơn tái nhân bản kho lưu trữ và tất cả các submodule của nó (s). –

+1

@JoshFarneman Làm thế nào tôi nên (newbie) hiểu những gì bạn đã làm. xin cung cấp 'rõ ràng mã' trước và sau. vì vậy người ta có thể hiểu những gì được yêu cầu. – alex

75

Hai file chứa submodule đường dẫn tuyệt đối:

{submodule}/.git 
.git/modules/{submodule}/config 

Vì vậy, nếu bạn di chuyển các repo, đường dẫn tuyệt đối trong hai tập tin này là không hợp lệ, và gây ra các lỗi 'không phải là một kho git'. Chỉ cần sửa các tệp này theo cách thủ công.

+10

Cảm ơn bạn, điều này làm việc tốt cho tôi. Tuy nhiên, đường dẫn thứ hai ngắn hơn một chút đối với tôi: '.git/modules/{submodule}/config' (Tôi đang sử dụng git phiên bản 1.7.9.5 trên Ubuntu) –

+1

Tôi vừa chuyển từ PC sang Mac và gặp vấn đề tương tự . Tôi đã cập nhật đường dẫn trong hai tệp đó và đường dẫn mới là chính xác nhưng tôi vẫn nhận được 'tử vong: Không phải là kho lưu trữ git'. Có một tập tin .git ở vị trí đó, vì vậy có lẽ tôi đang thiếu cái gì khác? –

+3

Chỉ cần lưu ý ở đây, đối với tôi tệp cấu hình có đường dẫn tương đối không giống tệp .git. –

35

Các phiên bản cũ của git sử dụng đường dẫn tuyệt đối để định vị gitdir của mô-đun con. Giải pháp như sau:

  1. Nâng cấp git lên latest version. Một số người nói rằng bạn sẽ cần ít nhất phiên bản 1.7.10. Tôi vừa giải quyết thành công vấn đề với git 1.8.3.
  2. Xóa tất cả các thư mục con bị hỏng: rm -rf broken_submodule_folder
  3. Cập nhật các mô-đun con đã đăng ký: git submodule update. Bạn sẽ thấy các mô-đun con được kiểm tra.
+0

Cảm ơn! Đã cứu tôi rất nhiều công việc, điều này! :-) – Potherca

1

tôi đã phải đối mặt với vấn đề này với các môđun con là tốt, nhưng sau khi phân tích hai tập tin

{submodule} /. Git .git/modules/submodules/{} submodule/config

tôi nhận ra rằng trong trường hợp của tôi, đây không phải là vấn đề.

Sau một ít nghiên cứu, tôi đã thấy rằng trong trường hợp của tôi, tôi phải thêm git (lệnh: module add git) và lỗi biến mất.

+1

Lệnh 'module add git' này của bạn là gì? –

4

Sau @ ax003d answer, bạn có thể thay thế tất cả những con đường cũ (old/path) với đường dẫn mới (new/path) sử dụng lệnh này:

find . -type f \(-name ".git" -o \(-path "*.git/modules/*" -name config \) \) -print0 | xargs -0 sed -i -e "s#old/path#new/path#g" 

Bạn có thể muốn kiểm tra những con đường cũ trông giống như trước khi thay thế chúng :

find . -type f \(-name ".git" -o \(-path "*.git/modules/*" -name config \) \) -print0 | xargs -0 grep --colour "old/path" 
4

tôi giải quyết vấn đề này bằng reseting tất cả git-submodules với

rm -rf .git/modules 
git submodule update --init 
+0

Chà! Chỉ cần làm việc cho tôi! Trong trường hợp của tôi, tôi đã vô tình tạo một "rm -r" không khớp với ký tự đại diện. Nó đã xóa một vài tập tin từ gốc của dự án trước khi bị dừng cho một số lời nhắc. – Sankalp

1

Trong trường hợp của tôi, vấn đề là tệp .git/HEAD không trỏ đến bất kỳ đâu, nó chỉ chứa một chuỗi ký tự lạ. Tôi đã sao chép nội dung của .git/ORIG_HEAD thành .git/HEAD và nó hoạt động trở lại.

Source

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