Sửa lỗi 'fatal: destination path already exists and is not an empty directory' trong Git Clone

beginner📦 Git2026-03-21| Git 2.x trên Linux, macOS, Windows — mọi shell (bash, zsh, PowerShell, CMD)

Error Message

fatal: destination path 'project-name' already exists and is not an empty directory.
#git#clone#thư mục#workspace

Tình Huống

Bạn chạy git clone, nhấn Enter, và ngay lập tức nhận được thông báo lỗi:

fatal: destination path 'project-name' already exists and is not an empty directory.

Có thể bạn đã clone repo này trước đó rồi quên mất. Có thể lần clone trước bị gián đoạn giữa chừng. Có thể một đồng nghiệp đã đặt gì đó vào thư mục đó rồi. Dù lý do là gì, Git từ chối ghi đè lên nó — và bạn cần giải quyết ngay bây giờ.

Nguyên Nhân

Git sẽ không clone vào một thư mục đã tồn tại và có chứa file. Đây là hành vi có chủ ý — Git đang bảo vệ bạn khỏi việc vô tình ghi đè lên công việc quan trọng. Thư mục đó có thể chứa:

  • Một bản clone trước đó (có thể chưa hoàn chỉnh) của cùng repo
  • Một archive hoặc scaffold đã giải nén một phần
  • Các file không liên quan bị đặt nhầm vào đó
  • Một Git repo hoàn toàn khác

Hãy xác định bạn đang gặp trường hợp nào trước khi làm bất cứ điều gì — cách xử lý khác nhau cho từng trường hợp.

Bước 1 — Kiểm Tra Nội Dung Thư Mục

# Xem có gì bên trong
ls -la project-name/

# Kiểm tra xem đây có phải là git repo chưa
ls -la project-name/.git/

Nếu có thư mục .git/ nghĩa là bạn đã có một bản clone rồi — hoàn chỉnh, bị lỗi, hoặc đã lỗi thời. Không có .git/ nghĩa là đây chỉ là một thư mục thông thường đang chiếm chỗ.

Cách Xử Lý A — Xóa và Clone Lại (Sạch Nhất)

Thư mục đó không có gì đáng giữ lại? Xóa đi và bắt đầu lại từ đầu:

# Linux / macOS
rm -rf project-name/
git clone https://github.com/org/project-name.git

# Windows PowerShell
Remove-Item -Recurse -Force project-name
git clone https://github.com/org/project-name.git

# Windows CMD
rd /s /q project-name
git clone https://github.com/org/project-name.git

Kiểm tra kết quả:

cd project-name
git status
# Kết quả mong đợi: On branch main, nothing to commit

Cách Xử Lý B — Clone Vào Thư Mục Khác

Không muốn xóa thư mục hiện tại? Chỉ cần chỉ định cho Git dùng một tên thư mục đích khác:

git clone https://github.com/org/project-name.git project-name-fresh

Hoặc tạo một bản sao có đánh số phiên bản bên cạnh:

mkdir project-name-v2 && git clone https://github.com/org/project-name.git project-name-v2

Đây là lựa chọn an toàn tuyệt đối — không có gì bị xóa hay bị ghi đè.

Cách Xử Lý C — Thư Mục Đã Là Một Clone (Fetch + Reset)

Đã có thư mục .git/? Thư mục đó đã là một Git repo rồi. Đừng xóa nó — chỉ cần cập nhật:

cd project-name

# Kiểm tra xem có trỏ đúng remote không
git remote -v

# Lấy các thay đổi mới nhất
git fetch --all
git reset --hard origin/main

# Hoặc để đồng bộ hoàn toàn với remote
git fetch origin
git checkout main
git reset --hard origin/main
git clean -fd

Lưu ý quan trọng: git clean -fd sẽ xóa vĩnh viễn các file và thư mục chưa được track. Hãy kiểm tra kỹ không có gì chưa lưu trước khi chạy lệnh đó.

Cách Xử Lý D — Khởi Tạo và Pull (Khi Chưa Có .git)

Thư mục có chứa file source nhưng chưa có Git history? Bỏ qua việc clone — khởi tạo repo tại chỗ và pull từ remote:

cd project-name
git init
git remote add origin https://github.com/org/project-name.git
git fetch origin
git reset --hard origin/main

Các file hiện có của bạn vẫn còn nguyên trong khi Git tải toàn bộ lịch sử về. Lưu ý rằng git reset --hard sẽ ghi đè các thay đổi cục bộ bằng nội dung trên remote branch — vì vậy hãy lưu lại bất cứ thứ gì bạn muốn giữ trước.

Giải Pháp Lâu Dài — Dùng Thư Mục Workspace Riêng

Lỗi này thường xảy ra nhiều nhất trên các hệ thống CI/CD và máy dev đang làm việc với nhiều repo cùng lúc. Thói quen đơn giản nhất để tránh lỗi này: luôn clone vào một thư mục workspace chuyên dụng.

# Thay vì:
git clone https://github.com/org/project-name.git

# Làm thế này:
mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/org/project-name.git

Trên CI/CD, thêm bước dọn dẹp trước khi clone:

# Ví dụ với GitHub Actions
- name: Clean workspace
  run: rm -rf ${{ github.workspace }}/project-name

- name: Clone repo
  run: git clone $REPO_URL

Đơn giản hơn nữa — dùng action actions/checkout có sẵn. Nó tự động xử lý các thư mục cũ.

Trên Jenkins, bật tùy chọn Wipe out repository & force clone trong cài đặt SCM, hoặc thêm một bước shell:

rm -rf ${WORKSPACE}/project-name || true
git clone ${REPO_URL} project-name

Kiểm Tra Kết Quả

cd project-name

# Xác nhận đây là repo hợp lệ
git status

# Xác nhận remote đúng
git remote -v

# Kiểm tra các commit gần nhất đã được tải về đúng
git log --oneline -5

Một bản clone sạch sẽ hiển thị như sau:

On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Thấy kết quả đó là xong. Nếu git status hiển thị file chưa được track hoặc có thay đổi bất thường? Hãy kiểm tra trước khi commit — có thứ gì đó còn sót lại.

Bảng Tóm Tắt Quyết Định

  • Thư mục không có gì quan trọng → xóa đi, clone lại
  • Đã là Git repo trỏ đúng remote → fetch + reset
  • Muốn giữ nguyên các file hiện có → clone vào thư mục khác
  • Có file source nhưng không có .git/ → git init + remote add + fetch + reset
  • Lỗi cứ lặp lại trên CI → thêm bước dọn dẹp trước khi clone

Related Error Notes