Sửa lỗi 'fatal: Unable to create index.lock: File exists' khi Git bị treo

beginner📦 Git2026-05-09| Git 2.x trên Linux, macOS, Windows (WSL, Git Bash, PowerShell) — mọi hệ điều hành nơi tiến trình Git bị crash hoặc đang chạy nền

Error Message

fatal: Unable to create '.../.git/index.lock': File exists.
#git#index.lock#troubleshooting#linux#macos#windows

Chuyện gì vừa xảy ra

Bạn chạy git add, git commit, hoặc git pull và nhận được thông báo lỗi này:

fatal: Unable to create '/path/to/repo/.git/index.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are stopped then try again. If it still fails, a git process
may have crashed in this repository earlier: remove the file manually
and restart.

Git dùng .git/index.lock như một mutex. Khi bắt đầu bất kỳ thao tác nào thay đổi index, Git sẽ tạo file này. Khi thao tác hoàn tất bình thường, Git sẽ xóa nó đi. Nếu Git bị crash giữa chừng, bị kill bằng Ctrl+C, hoặc vẫn đang chạy ở terminal khác — file này sẽ còn đó. Mọi lệnh Git tiếp theo đều phát hiện ra nó và từ chối tác động vào index cho đến khi file biến mất.

Bước 1: Kiểm tra xem có tiến trình Git nào đang thực sự chạy không

Đừng xóa bất cứ thứ gì vội. Trước tiên hãy xác nhận lock này thực sự là cũ và không đang bảo vệ một thao tác đang diễn ra.

Trên Linux / macOS

# Kiểm tra các tiến trình git đang tác động vào repo của bạn
ps aux | grep git

Tìm tiến trình git nào có thư mục làm việc trùng với repo của bạn. Kiểm tra cả editor — VS Code, Vim, và các IDE của JetBrains đều chạy các tiến trình git nền để hiển thị thanh trạng thái, git blame, và panel diff. Bất kỳ cái nào trong số này đều có thể là thủ phạm.

Trên Windows (PowerShell)

Get-Process | Where-Object { $_.Name -like "*git*" }

Trên Windows (Git Bash / WSL)

ps aux | grep git
# hoặc
tasklist | grep git

Tìm thấy tiến trình Git đang chạy? Kill nó hoặc chờ nó hoàn thành, rồi thử lại lệnh ban đầu. Không có gì đang chạy? Tiến hành xóa lock thôi.

Bước 2: Xác nhận file lock tồn tại

ls -la .git/index.lock

Bạn sẽ thấy kết quả tương tự như sau:

-rw-r--r-- 1 ubuntu ubuntu 0 May  8 02:14 .git/index.lock

Kiểm tra timestamp. Một file nằm đó từ 20 phút trước — hoặc từ hôm qua — mà không có tiến trình Git nào đang chạy thì đó là lock cũ. Xóa đi an toàn thôi.

Bước 3: Xóa file lock cũ

Linux / macOS

rm -f .git/index.lock

Windows (PowerShell)

Remove-Item .git\index.lock -Force

Windows (Git Bash)

rm -f .git/index.lock

Flag -f giúp tránh lỗi nếu file đã biến mất giữa lúc bạn kiểm tra và lúc xóa — dù sao cũng vô hại.

Bước 4: Xác nhận Git đã hoạt động trở lại

# Kiểm tra chỉ đọc — không có tác dụng phụ
git status

Thấy thông tin working tree mà không có lỗi? Ổn rồi đó. Chạy lại lệnh bạn đang cần làm lúc nãy:

git add .
git commit -m "your message"
# hoặc
git pull origin main

Trường hợp đặc biệt: nhiều file lock

Một vụ crash nặng đôi khi có thể để lại các file lock rải rác ở các Git object khác, không chỉ riêng index. Vẫn còn lỗi sau khi xóa index.lock? Quét toàn bộ thư mục .git:

# Tìm tất cả file .lock trong thư mục .git
find .git -name "*.lock" -type f

Những file thường gặp:

  • .git/index.lock — nghi phạm quen thuộc, chặn các thao tác trên index
  • .git/refs/heads/main.lock — chặn cập nhật ref (do push hoặc commit thất bại để lại)
  • .git/HEAD.lock — hiếm gặp, chặn ghi vào HEAD
  • .git/packed-refs.lock — chặn các thao tác pack-ref

Khi không có tiến trình Git nào đang chạy, xóa hết một lần:

find .git -name "*.lock" -type f -delete

Tại sao lỗi này cứ lặp lại (và cách ngăn chặn)

Plugin của editor là thủ phạm số 1

Panel Git của VS Code, cửa sổ version control của JetBrains, Sublime Merge — tất cả đều gọi git status vài giây một lần trong nền. Một vụ crash trong lúc đang refresh là bạn có ngay một stale lock. Hai cách khắc phục nhanh: đóng editor trước khi chạy Git từ terminal, hoặc trỏ tích hợp Git của editor vào một worktree riêng để nó không bao giờ đụng vào thư mục .git chính của bạn.

Phiên terminal bị gián đoạn

Nhấn Ctrl+C giữa chừng khi commit, SSH bị ngắt kết nối, hoặc container khởi động lại đều kill Git mà không dọn dẹp. Nếu bạn làm việc qua SSH trên máy remote, hãy chạy các lệnh Git trong tmux hoặc screen — phiên làm việc của bạn sẽ tồn tại khi mất kết nối và Git hoàn thành sạch sẽ:

tmux new -s work
# chạy các lệnh git ở đây
# kết nối lại sau bằng: tmux attach -t work

CI/CD pipeline chạy song song

Hai job pipeline cùng chạy git fetch trên một thư mục clone chung sẽ tranh nhau. Một cái thắng, cái kia ném ra đúng lỗi này. Cách fix đơn giản: cho mỗi job một bản clone mới riêng. Trong GitHub Actions, vấn đề này thường gặp ở các team dùng self-hosted runner chung với workspace cố định. Thêm nhóm concurrency để serialize các lần chạy trên cùng branch:

# .github/workflows/deploy.yml
concurrency:
  group: deploy-${{ github.ref }}
  cancel-in-progress: true

Tóm tắt nhanh

  • Kiểm tra tiến trình đang chạy: ps aux | grep git
  • Tìm tất cả file lock: find .git -name "*.lock"
  • Xóa index lock: rm -f .git/index.lock
  • Xóa tất cả lock (khi không có tiến trình nào đang chạy): find .git -name "*.lock" -delete
  • Xác nhận: git status

Related Error Notes