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
- Remove index với lệnh git rm –cached <file cần remove>
- Thêm file vào .gitignore
- 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.