TL;DR: Cách sửa nhanh
Có khả năng bạn thấy lỗi này vì index của Git—khu vực staging nội bộ—coi một thư mục là một submodule, nhưng nó không tìm thấy URL tương ứng trong tệp .gitmodules của bạn. Bạn có hai cách để giải quyết vấn đề này tùy thuộc vào mục tiêu của mình.
Tùy chọn A: Đăng ký lại submodule
Nếu thư mục đó thực sự là một submodule, hãy cho Git biết kho lưu trữ (remote repository) nằm ở đâu. Thay thế libs/ui bằng đường dẫn cụ thể của bạn:
# Nếu Git báo đường dẫn đã tồn tại trong index, hãy xóa nó trước:
git rm --cached libs/ui
# Bây giờ thêm lại một cách chính xác:
git submodule add https://github.com/username/repo.git libs/ui
Tùy chọn B: Chuyển đổi thành thư mục thông thường
Có phải bạn đã vô tình thêm một thư mục chứa lịch sử .git riêng của nó không? Bạn có thể loại bỏ siêu dữ liệu (metadata) của submodule và theo dõi nó như một thư mục bình thường:
git rm --cached libs/ui
rm -rf libs/ui/.git # Xóa lịch sử Git nội bộ
git add libs/ui
git commit -m "Chuyển đổi submodule bị hỏng thành thư mục bình thường"
Tại sao Git lại báo lỗi?
Các submodule trong Git dựa trên sự phối hợp chặt chẽ giữa tệp .gitmodules, tệp .git/config và Git Index. Lỗi fatal: No url found xảy ra khi sự phối hợp này thất bại.
Cụ thể, Git Index của bạn chứa một "gitlink". Đây là một mục nhập 160-bit đặc biệt trỏ đến một commit cụ thể trong một kho lưu trữ khác. Khi bạn chạy một lệnh như git submodule update, Git sẽ nhìn vào gitlink đó và sau đó kiểm tra .gitmodules để tìm nguồn tải xuống. Nếu thiếu URL hoặc tên không khớp chính xác, Git sẽ dừng lại.
Các tình huống phổ biến gây ra lỗi này bao gồm:
- Xung đột Merge: Xung đột khi merge trong
.gitmodulesđược giải quyết bằng cách xóa nhầm các dòng quan trọng. - Xóa thủ công: Lập trình viên đã xóa mục submodule khỏi tệp văn bản nhưng quên xóa nó khỏi hệ thống theo dõi nội bộ của Git.
- Kho lưu trữ lồng nhau: Bạn đã sao chép một thư viện từ dự án khác (như
vendor/bootstrap) mà vẫn còn thư mục.gitriêng ẩn bên trong.
Các phương pháp sửa lỗi hiệu quả
1. Sửa thủ công tệp .gitmodules
Đôi khi cách sửa dễ nhất là tự viết cấu hình. Hãy mở .gitmodules trong trình soạn thảo. Đảm bảo khối mã trông chính xác như thế này, khớp với đường dẫn thư mục của bạn:
[submodule "libs/ui"]
path = libs/ui
url = https://github.com/example/ui-library.git
Sự chính xác là chìa khóa ở đây. Chuỗi trong [submodule "name"] phải khớp với cấu trúc dự án của bạn. Sau khi lưu tệp, hãy chạy các lệnh sau để đồng bộ trạng thái:
git submodule sync
git submodule update --init --recursive
2. Loại bỏ Submodule "ma"
Nếu bạn không có ý định để một thư mục làm submodule, Git có thể đang bị nhầm lẫn bởi một tệp .git cũ. Để khắc phục, bạn phải xóa đường dẫn khỏi index mà không xóa các tệp thực tế. Sử dụng lệnh git rm --cached folder/path, nhưng lưu ý không thêm dấu gạch chéo ở cuối. Điều này yêu cầu Git ngừng coi thư mục đó là một liên kết kho lưu trữ riêng biệt.
3. Đặt lại Submodule Cache
Nếu cấu hình của bạn có vẻ đúng nhưng Git vẫn báo lỗi, bộ nhớ đệm (cache) cục bộ có thể đã bị hỏng. Bạn có thể buộc đặt lại bằng cách xóa mục nhập khỏi index và thêm lại. Việc này sẽ làm mới gitlink và đảm bảo tệp .git/config được cập nhật để khớp với .gitmodules của bạn.
Kiểm tra tình trạng kho lưu trữ của bạn
Sau khi áp dụng bản sửa lỗi, hãy thực hiện ba bước kiểm tra sau để đảm bảo mọi thứ đã trở lại bình thường:
- Kiểm tra trạng thái: Chạy lệnh
git submodule status. Bạn sẽ thấy một mã hash commit kèm theo đường dẫn. Nếu không có lỗi xuất hiện, bạn đã thành công. - Kiểm tra cấu hình: Chạy lệnh
cat .git/config. Xác minh rằng các phần[submodule]ở đó khớp với những gì bạn có trong.gitmodules. - Cập nhật toàn diện: Chạy
git submodule update --init --recursive. Đây là bài kiểm tra cuối cùng. Nếu lệnh hoàn tất mà không có lỗi fatal, dự án đã được sửa chữa hoàn toàn.

