Fix lỗi 'fatal: not a git repository (or any of the parent directories): .git' trong Git

beginner📦 Git2026-03-18| Git 2.x trên Linux, macOS, Windows (Git Bash / WSL / Terminal)

Error Message

fatal: not a git repository (or any of the parent directories): .git
#git#repository#init

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 .git bị 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 .git tồ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 .git là 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 .git và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 .dockerignore bấ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.

Related Error Notes