Mô tả lỗi
Bạn chạy git status hoặc git pull và nhận được thông báo sau:
fatal: not a git repository (or any of the parent directories): .git
Git đã duyệt toàn bộ cây thư mục của bạn nhưng không tìm thấy thư mục .git ở bất kỳ đâu. Git không biết bạn đang muốn làm việc với repository nào.
Nguyên nhân
Mọi Git repo đều lưu một thư mục ẩn .git tại thư mục gốc. Thư mục đó chứa toàn bộ lịch sử commit, tham chiếu branch, cấu hình và dữ liệu theo dõi — tất cả những gì Git cần để hoạt động. Không có .git thì Git không thể làm gì.
Có sáu nguyên nhân phổ biến gây ra lỗi này:
- Bạn đang chạy lệnh bên ngoài repo (sai thư mục)
- Dự án chưa bao giờ được khởi tạo bằng
git init - Thư mục
.gitbị xóa — vô tình hoặc do script dọn dẹp - Bạn đã clone vào một thư mục con và hiện đang ở một cấp trên hoặc dưới nơi
.gittồn tại - Docker container hoặc CI job chưa mount hoặc clone repo
- Bạn đang ở trong một Git submodule có link file bị hỏng
Cách sửa 1: Kiểm tra thư mục hiện tại trước
Chín trong mười trường hợp, cách sửa đơn giản như vậy — bạn chỉ đang ở sai thư mục. Xác nhận vị trí hiện tại:
pwd
Sau đó tìm thư mục .git:
ls -la | grep .git
Không thấy gì? Hoặc bạn đang ở sai chỗ, hoặc repo chưa được khởi tạo.
Điều hướng đến thư mục gốc dự án và thử lại:
cd /path/to/your/project
git status
Không chắc repo nằm ở đâu? Tìm kiếm nó:
# Linux/macOS
find ~ -name ".git" -type d 2>/dev/null
# Windows (PowerShell)
Get-ChildItem -Path C:\ -Filter .git -Recurse -Directory -ErrorAction SilentlyContinue
Cách sửa 2: Khởi tạo repository mới
Bắt đầu từ đầu và dự án chưa bao giờ là Git repo? Một lệnh là đủ:
cd /path/to/your/project
git init
Git xác nhận bằng thông báo:
Initialized empty Git repository in /path/to/your/project/.git/
Stage các file và tạo commit đầu tiên:
git add .
git commit -m "Initial commit"
Kết nối với GitHub hoặc GitLab? Thêm remote và push:
git remote add origin https://github.com/youruser/yourrepo.git
git branch -M main
git push -u origin main
Cách sửa 3: Clone lại repository
Lỡ tay xóa .git và không có bản sao lưu? Clone lại từ remote. Đây là cách sạch nhất để tiếp tục.
# Lưu lại các file hiện tại (chưa commit) trước
mv /path/to/project /path/to/project_backup
# Clone bản mới
git clone https://github.com/youruser/yourrepo.git /path/to/project
Sau khi clone xong, sao chép thủ công các thay đổi chưa commit từ thư mục backup về.
Cách sửa 4: Sai thư mục sau khi clone
Lỗi cổ điển: bạn chạy git clone, Git tạo một thư mục mới, nhưng bạn quên cd vào trong trước khi chạy lệnh tiếp theo.
# Bạn đã clone tại đây:
git clone https://github.com/youruser/myproject.git
# Git tạo ra: ./myproject/
# Nhưng bạn vẫn đang ở thư mục cha — git status sẽ thất bại
# Sửa: bước vào thư mục
cd myproject
git status
Cách sửa 5: CI/CD hoặc Docker — Thiếu bước checkout
Trong các pipeline tự động, lỗi này hầu như luôn có nghĩa là lệnh Git chạy trước khi repo thực sự được checkout. Trong GitHub Actions, action checkout phải đặt lên đầu tiên:
steps:
- name: Checkout code
uses: actions/checkout@v4 # ← phải đặt đầu tiên
- name: Run git log
run: git log --oneline -5
Docker là trường hợp khác. Thư mục .git thường bị loại trừ âm thầm qua .dockerignore. Kiểm tra file đó:
# Dòng này loại bỏ .git khỏi build context:
.git
# Xóa dòng này nếu bạn cần lịch sử git bên trong container
Đang mount volume? Hãy đảm bảo đường dẫn host bạn mount thực sự chứa thư mục .git — không chỉ các file source.
Cách sửa 6: Git Worktrees hoặc Submodules
Bên trong một submodule hoặc worktree, .git là một file chứ không phải thư mục. Đó là điều bình thường — nó trỏ đến dữ liệu git thực sự ở nơi khác:
cat .git
# gitdir: ../.git/worktrees/myworktree
Nếu file đó bị mất hoặc bị hỏng, hãy khởi tạo lại từ thư mục gốc của repo cha:
git submodule update --init --recursive
Kiểm tra sau khi sửa
Chạy ba lệnh kiểm tra này sau bất kỳ cách sửa nào ở trên:
# Hiển thị tên branch và các file đang được theo dõi
git status
# Liệt kê các commit gần đây
git log --oneline -5
# Xác nhận .git tồn tại và là một thư mục
ls -la .git
Thấy thông tin branch trong git status? Bạn đã xong.
Phòng ngừa
- Coi
.gitlà thiêng liêng. Đừng bao giờ xóa thủ công trừ khi bạn cố tình bỏ theo dõi một dự án. Toàn bộ thư mục đó chính là lịch sử phiên bản của bạn. - Sao lưu nó. Đưa
.gitvào bất kỳ bản backup dự án nào — không chỉ các file source. - Trong CI, checkout trước. Mọi pipeline chạy lệnh Git đều cần bước checkout đặt ở đầu, không có ngoại lệ.
- Đặt lệnh hay dùng vào shell alias với
cdđến thư mục gốc dự án trước — loại bỏ hoàn toàn lỗi nhầm thư mục. - Kiểm tra
.dockerignorebất cứ khi nào bạn cần lịch sử Git bên trong container. Đó là loại trừ âm thầm rất dễ bỏ sót.

