[Git] Xoá tận gốc rễ một file đã từng push lên github

Chào các bạn,

Blog chắc bị mốc meo mất rồi. Mình lười viết quá ý, hôm nay rảnh thứ 7 nên ngó qua blog xem tình hình mọi người vào blog có nhiều không 😀

Đều đều 100 views/ngày là vui rồi =)). Lại thấy chủ đề Git là mọi người xem nhiều nhất nên tự dưng lại nghĩ ra một vấn đề mà hôm trước đồng nghiệp cũ hỏi là làm thế nào để xoá tận gốc file mà nó đã từng commitpush lên github/gitlab/… file đó lại ở nhiều nhánh nữa.

Thấy đồng nghiệp hỏi câu này cũng hay nên bắt đầu mò tìm, thực ra thì cũng có người trong cộng đồng họ cũng gặp phải vấn đề này rồi. Mình thì cũng đọc lại của họ rồi giờ chia sẻ lại với mọi người đây.

Tình huống là mình có 1 project demo “Hello World” như hình:

Project demo delete file in git

3 branch: master, dev1, dev2. Cả 3 branchs này đều đang chứa 1 file ActivationTool.zip. File này vô tình mình đã tải lên github và giờ muốn xoá tận gốc (xoá hết ở các commit, các branch) file này.

File ActivationTool.zip lỡ tay push lên cả 3 branch.

Đầu tiên mình nghĩ là click chuột phải rồi xoá file đó đi rồi push lên github thêm 1 commit nữa là được (2 năm trước sẽ nghĩ vậy =))) ).

Xoá file và push thêm 1 commit nữa ở master

Ơ, nào đâu có dễ cưng. Git nó tạo commit là nó đã lưu lại rồi. Ông nào muốn lấy file này chỉ cần reset lùi commit là lấy lại được file thôi, còn chưa nói tới các branchs khác cũng đang có file này nữa. Không làm thế này được. Vậy làm thế nào để trị trường hợp này.

Đây đây, các bạn sử dụng đoạn code sau:

Bước 1: Xoá file ở local

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
  --prune-empty --tag-name-filter cat -- --all

PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA: đường dẫn của file cần xoá tận gốc
Có những file nằm các thư mục khác nhau, nên cần trỏ rõ path chính xác, ví dụ: 
src/main/resources/application-dev.properties

Áp dụng:

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch ActivationTool.zip" \
  --prune-empty --tag-name-filter cat -- --all

Sau khi thực hiện câu lệnh trên thì git nó sẽ xoá toàn bộ các file ở local trong các branch và các commit rồi.

Bước 2: Xoá ở remote (hay hiểu là trên github, gitlab, …)

Để xoá được trên remote thì cần push force. Force là ép remote theo cái mới mất mà client gửi lên. Khi dùng cờ force để push này các bạn phải quan sát, kiểm tra lại xem có đúng file các bạn muốn xoá không nhé. Không là toang đấy. =))) Sao lại toang hả? Nó force trên github thì nó xoá hết file ở các commit, branchs. Nhầm sang file quan trọng thì sẽ ra sao? =)))

  1. Lệnh push lên remote:
git push origin --force --all

2. Đối với các phiên bản mà đã release thì cần force cho các tags ở các file phiên bản nữa nhé.

git push origin --force --tags

Vậy là ngon rồi nhé :3

Github: https://github.com/khiemnd5/demo_delete_file_in_git

Tham khảo:

https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/removing-sensitive-data-from-a-repository

Bình luận về bài viết này

Trang web này sử dụng Akismet để lọc thư rác. Tìm hiểu cách xử lý bình luận của bạn.