Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Git Lỗi "Cannot open .git/FETCH_HEAD: Permission denied" - Giải pháp

Git cần quyền ghi trên các file trong thư mục gọi là .git/ bên trong thư mục dự án của bạn. Nếu dòng lệnh Git không có quyền truy cập thư mục này, bạn sẽ gặp lỗi như "Cannot open .git/FETCH_HEAD: Permission denied" khi thử kéo (pull) file.

Trong hướng dẫn này, chúng ta sẽ thảo luận lỗi này có nghĩa là gì và nguyên nhân. Chúng ta sẽ đi qua ví dụ để bạn học cách sửa nó trong chương trình.

Cannot open .git/FETCH_HEAD: Permission denied

Kho Git chứa thư mục đặc biệt gọi là .git/. Bạn có thể chưa thấy thư mục này vì nó bị ẩn. Trạng thái ẩn của thư mục này được biểu thị bằng dấu chấm (".") ở đầu tên thư mục.

Thư mục này chứa nhiều mảnh siêu dữ liệu về kho. Nó theo dõi tùy chọn cấu hình đặc thù dự án, tham chiếu trong dự án, HEAD hiện tại, trong số các mảnh thông tin quan trọng khác về kho.

Git cần quyền đọc và ghi vào thư mục này. Điều này là vì nội dung của nó sẽ thay đổi khi bạn chạy lệnh như git config và git pull.

Ví dụ Tình huống

Chúng ta sẽ clone kho gọi là ck-git từ GitHub. Kho này chứa file gọi là README.md. Để clone kho này, chúng ta có thể dùng lệnh git clone:

sudo git clone https://github.com/Career-Karma-Tutorials/ck-git

Nội dung file README.md hiện tại là:

# ck-git

Chúng ta muốn thay đổi file này để chứa README.md mô tả hơn. Chúng ta sẽ mở file trong trình soạn thảo và thay đổi nội dung thành:

# Career Karma Git Demo

Kho lưu trữ với file demo cho hướng dẫn Git của Career Karma.

Đó là tốt hơn. File của chúng ta mô tả chính xác hơn mục đích kho Git. Bây giờ, hãy thêm thay đổi này vào khu vực chuẩn bị (staging area) để tạo commit:

sudo git add README.md

Git biết chúng ta muốn thêm README.md vào commit tiếp theo. Để thay đổi hiển thị trong kho từ xa, chúng ta phải thêm vào commit:

sudo git commit -m "docs: Make README.md more descriptive"

Commit của chúng ta giờ sẵn sàng đẩy lên kho từ xa. Trước khi đẩy mã, chúng ta sẽ kéo (pull) phiên bản từ xa của kho. Điều này cho chúng ta chắc chắn rằng chúng ta cập nhật với bất kỳ thay đổi nào đã làm kể từ khi clone kho:

git pull

Lệnh này trả về:

error: cannot open .git/FETCH_HEAD: Permission denied

Lỗi này cho chúng ta biết Git không thể truy cập một trong các file cấu hình của nó, FETCH_HEAD.

Giải pháp

Chúng ta clone kho ck-git dùng lệnh "sudo". Điều này có nghĩa là kho được clone như user root. Vì user root clone kho, các file trong kho thuộc sở hữu của user root.

Chúng ta có thể thấy điều này bằng cách chạy lệnh ls -la:

total 8
drwxr-xr-x 4 root staff 128 Sep 17 07:15 .
drwxr-xr-x+ 90 James staff 2880 Sep 17 07:15 ..
drwxr-xr-x 12 root staff 384 Sep 17 07:15 .git
-rw-r--r-- 1 root staff 1 Sep 17 07:15 README.md

Tất cả file trong thư mục thuộc về "root", là một phần của tài khoản "staff". Khi chúng ta thử kéo kho từ xa không dùng "sudo", lỗi được trả về. Điều này là vì tài khoản user tiêu chuẩn không có quyền sửa file trong thư mục.

Để sửa vấn đề này, chúng ta sẽ thay đổi quyền sở hữu file trong thư mục. Chúng ta có thể làm điều này dùng lệnh chown:

sudo chown -R james:staff .

Lệnh này thay đổi chi tiết quyền sở hữu tất cả file và thư mục trong kho, bao gồm thư mục .git/. Chúng ta giờ là chủ sở hữu thư mục và có toàn quyền truy cập thư mục dự án. Chúng ta giờ nên có thể kéo mã:

git pull

Lệnh này thực thi thành công và trả về:

Already up to date.

Chúng ta giờ biết không có thay đổi nào được làm cho kho từ xa kể từ khi chúng ta cuối cùng kéo mã. Chúng ta cuối cùng kéo mã khi tạo kho.

Kết luận

Lỗi Git "Cannot open .git/FETCH_HEAD: Permission denied" xảy ra khi bạn thử kéo mã từ kho từ xa khi thư mục .git/ trong thư mục dự án không thể truy cập được cho user hiện tại.

Để giải quyết lỗi này, hãy chắc chắn user hiện tại có đặc quyền đọc-ghi (read-write) cho kho Git bạn đang làm việc.