Remove những file đã được commit vào git repository

Thực tế đây là một kĩ thuật ít được sử dụng bởi không mấy khi ta cần dùng đến, tuy nhiên đến khi cần dùng thì rất nhiều người không biết phải làm thế nào. Đó là khi muốn bỏ theo dõi một file đã được commit vào repository nhưng lại không muốn xóa khỏi project. Giả sử bạn có một project như sau, project này đã được push lên git repository.

Đương nhiên ta không muốn push đống library của NodeJS lên repo, vậy nên trong file .gitignore ta đã thêm vào như sau trước khi commit.

/node_modules

Như vậy toàn bộ các file đã được đưa lên repository trừ thư mục node_modules. Giả sử ngày trước bạn tracking luôn file dữ liệu và đưa nó lên repo. Tuy nhiên bây giờ bạn thấy điều đó không cần thiết nữa và muốn bỏ nó khỏi repo. Nhiều bạn có thể sẽ viết thêm và trong file .gitignore như sau.

/node_modules
data.json

Sau đó commit lên repo nhưng file data.json vẫn ở đó. Thực tế khi một file đã được commit vào repo thì ta không thể loại bỏ nó một cách đơn giản là thêm tên file vào file .gitignore được nữa. Lúc này ta sẽ cần untrack file đó và kết thúc quá trình bằng cách commit thông tin thay đổi vào repo.

Bước 1: Xóa file khỏi repo

Để remove file data.json khỏi repo, ta mở terminal và vào thư mục gốc của project, sau đó ta chạy lệnh sau:

git rm --cached ./src/data.json
  • rm là lệnh remove
  • –cached cho phép ra chỉ xóa index chứ không xóa hẳn file đó, nếu bỏ đi thì lệnh này sẽ xóa hẳn file khỏi project
  • do đang đứng ở thư mục gốc nên ta cần chỉ đường dẫn tới file cần xóa

khi đó sẽ có dòng thông báo là

rm 'src/data.json'

Thực tế ta chỉ xóa index của file đó nhằm remove khỏi repo chứ file đó vẫn còn trong project. Ngoài ra nếu ta muốn untrack tất cả các file để add lại từ đầu giống như lần commit đầu tiên, ta có thể làm như sau:

git rm -r --cached .
  • -r là viết tắt của recursive, nếu muốn xóa toàn bộ index thì cần có lần có lệnh đệ quy này
  • . nghĩa là tất cả các file đều bị untrack

Lệnh này sẽ untrack toàn bộ, nếu cẩn thận ta có thể thêm -n để test thử trước

git rm -r -n --cached .

Dù có -n hay không khi chạy lệnh ta sẽ nhận được thông báo sau.

rm '.gitignore'
rm 'README.md'
rm 'package.json'
rm 'src/app.js'
rm 'src/data.json'

Nếu lệnh chạy có “-n” thì nghĩa là lệnh đó đã thành công nhưng chưa có file nào bị ảnh hưởng. Chỉ khi bỏ “-n” đi thì toàn bộ file mới bị ảnh hưởng.

Bước 2: Update file .gitignore

Ở bước 1 sau khi chạy

git rm --cached ./src/data.json

Nếu ta sử dụng Git GUI như là GitExtensions ta có thể nhìn vào mục commit.

Khi đó ở phần commit ta thấy file data.json đã ở trạng thái bị remove khỏi repo, còn ở working directory sẽ xuất hiện trạng thái thêm vào một file data.json. Đương nhiên ta không muốn file này bị add lại nữa, ta sẽ thêm tên file này vào file .gitignore để bỏ qua như đã để cập ở phần đầu.

/node_modules
data.json

Lúc này mục commit sẽ không còn file data.json xuất hiện, thay vào đó là sự thay đổi của file .gitignore

Bước 3: Commit

Lúc này, ta chỉ cần commit file .gitignore này là xong. Cuối cùng, ta sẽ push tất cả các thay đổi lên git server là hoàn tất việc loại bỏ file data.json khỏi repo mà không xóa file khỏi project.

Kết luận

Vậy để remove những file đã được commit vào repo ta chỉ cần nhớ 3 bước đơn giản

  1. Remove index với lệnh git rm –cached <file cần remove>
  2. Thêm file vào .gitignore
  3. Commit những gì thay đổi

Trong bài viết này mình đã đề cập đến một kĩ thuật nhỏ nhưng vô cùng tiện tích trong git. Có thể sẽ rất hiếm khi bạn phải dùng đến, nhưng nếu có nhu cầu, bạn sẽ thấy vấn đề này giải quyết vô cùng đơn giản.

Leave a Reply

Your email address will not be published. Required fields are marked *