Hướng dẫn tự học Git và Github từ cơ bản đến nâng cao

Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất

Bài 6: Gitignore là gì? Sử dụng .gitignore sao cho hiệu quả nhất?

Git là một công cụ tuyệt vời để theo dõi tất cả các tệp trong một dự án. Cho dù bạn chỉ có một vài file hay vài ngàn file dự án để theo dõi nhưng có một số file không nhất thiết bạn phải theo dõi nó trong suốt vòng đời của dự án. Hãy xem Git giúp gì cho bạn trong trường hợp này nhé!

Trong bài viết này, chúng ta sẽ tìm hiểu nguyên nhân tại sao chúng ta nên "nói" với Git bỏ qua một số file nhất định. Cách làm điều đó như thế nào và một số ví dụ thực tiễn tốt nhất cho bạn

Tại sao nên sử dụng .gitignore?

Bỏ qua thủ công các file mà bạn không muốn theo dõi có thể quản lý được trong một dự án quy mô nhỏ, nhưng ngay khi dự án của bạn bắt đầu phát triển và nó có đến hàng chục hoặc hàng trăm file không được kiểm soát phiên bản, thì chắc chắn đó một vấn đề lớn sẽ khiến bạn đau đầu. Các file này sẽ bắt đầu làm lộn xộn danh sách "Các file không bị theo dõi" trong đầu bạn, điều này có thể khiến bạn bỏ qua các file hợp pháp cần có trong repository.

Để giải quyết vấn đề này, Git có một cơ chế "bỏ qua" dưới dạng một file được gọi .gitignore. Với file này và cách khai báo mẫu rất đơn giản, bạn có thể cho Git biết loại file nào bạn muốn nó bỏ qua và không theo dõi trong repo của bạn. Nếu tên file trong dự án của bạn khớp với một trong các mẫu có trong .gitignorefile thì Git sẽ không cố theo dõi file và nó sẽ không hiển thị trong danh sách "File không bị theo dõi" Untracked files

Vậy phải bỏ qua "ignore" những tập tin nào?

Điều này tùy thuộc vào sở thích cá nhân, nhưng nói chung chúng ta nên có xu hướng tuân theo các quy tắc chung này về các file không theo dõi như sau:

  • - Các file hệ thống (Ví dụ: Trong MacOS: .DS_Store hoặc Thumb.db)
  • - File cấu hình ứng dụng (Ví dụ: app.config, .envvv)
  • - File được build ra trong quá trình biên dịch (Ví dụ: Python *.pyc hoặc các file *.tmp, *.lock)
  • - Thư mục lưu trữ và tìm kiếm các modules (Ví dụ:  Trong Node.js có node_modules)
  • - Các file văn bản và file thông tin cá nhân (Ví dụ: todo.txt)
  • - Cơ sở dữ liệu và các file lưu log (Ví dụ: *.log, *.sqlite, ...)

Có khá nhiều loại file khác thường bị bỏ qua, nhưng rất nhiều trong số này thuộc về sở thích cá nhân, như sau:

  • - Tập tin cấu hình dev (Ví dụ: .jshintrc)
  • - Các mã nguồn được tạo hoặc rút gọn (Ví dụ: *.min.js)
  • - .gitignore

Vâng, thậm chí ngay cả việc có nên theo dõi file .gitignore  trong chính nó cung đang gây tranh luận.

Lời khuyên đưa ra ở đây là bạn có thể thay đổi tùy thuộc vào người đang làm việc cùng dự án với bạn, vì bạn có thể muốn thực hiện điều này với một số ít người nhưng với những người khác thì file .gitignore phải khác chẳng hạn. Mọi người đều có ý kiến về những gì nên hoặc không nên theo dõi, vì vậy lựa chọn tốt nhất của bạn là xem xét cả hai mặt của cuộc tranh luận và sau đó tự đưa ra quyết định dựa trên những gì tốt nhất cho dự án của bạn.

Sử dụng .gitignore sao cho hiệu quả nhất

Việc sử dụng tính năng bỏ qua này của Git khá đơn giản, đó là những gì chúng ta sẽ tìm hiểu trong phần này. Gả sử tôi có một dự án nodejs mới với các file chưa được theo dõi sau:

Gitignore - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Việc theo dõi các file .DS_Store và node_modules/file trong repo của chúng ta là hơi thừa , vì vậy tôi sẽ bỏ qua những thứ này. Để làm như vậy, trước tiên chúng ta sẽ tạo một file trong thư mục gốc của dự án có tên .gitignore:

touch .gitignore

Cách đơn giản nhất để bỏ qua một file và phổ biến nhất là chỉ cần thêm tên file đầy đủ vào file bỏ qua. Vì vậy, để bỏ qua các file trên, ví dụ, chúng tôi sẽ muốn thêm các file sau:

.DS_Storenode_modules

Sau khi lưu, Git sẽ hiển thị cho chúng tôi các file chưa được theo dõi sau đây:

Gitignore - Hướng dẫn sử dụng Git - Aptech Buôn Ma Thuột

Cả hai .DS_Store và node_modules hiện đã đi khỏi danh sách "Untracked files", nhưng tôi vẫn còn một vài thứ muốn loại bỏ, .env-dev và .env-prod. Để tránh phải thêm từng .gitignorefile một cách rõ ràng (đặc biệt nếu tôi phải thêm nhiều file này cho môi trường thử nghiệm và dàn dựng), tôi sẽ sử dụng ký tự đại diện trong .gitignore như sau:

.DS_Storenode_modules.env-*

Và bây giờ danh sách "Untracked files" của chúng ta đã bị giảm hơn nữa. Ký tự đại diện ( * ) sẽ khớp với bất cứ ký tự gì kể từ nó trở đi ngoại trừ dấu gạch chéo ( / ).

Sử dụng hai ký tự đại diện trong một hàng ( ** ) theo sau là dấu gạch chéo sẽ khớp với mẫu của bạn trong tất cả các thư mục.

Ví dụ: public/**/*.min.js sẽ bỏ qua tất cả các file JavaScript được rút gọn trong thư mục public, bất kể chúng có nằm trong thư mục con nào của thư mục public.

Cơ chế bỏ qua Git cũng hỗ trợ một số cú pháp giống như biểu thức chính quy đơn giản, với một số cú pháp bổ sung của chính nó:

  • -   [0-9a-zA-Z]: Khớp với một loạt các ký tự theo mẫu định sẵn
  • -   ?: Tối đa 1 ký tự xuất hiện cùng với mẫu
  • -   !: Phủ định kết quả khớp hoặc ký tự trước

Ví dụ:  

Mẫu Không theo dõi Theo dõi Giải thích
*.log
!important.log
debug.log
trace.log
important.log
logs/important.log
Dấu chấm than ( ! ) sẽ cho một mẫu phủ nhận. Nếu một file phù hợp với một mẫu, nhưng cũng phù hợp với một mẫu phủ định được xác định sau trong tệp, nó vẫn sẽ bị theo dõi.
debug?.log
debug??.log
debug0.log
debug20.log
debug20.log
debug0.log
Mỗi dấu hỏi ( ? ) khớp chính xác với mỗi ký tự bất kỳ.
debug[0-9].log    debug0.log
debug1.log
debug10.log Dấu ngoặc vuông [ ] được sử dụng để khớp với một ký tự từ một phạm vi được chỉ định.
debug[a-z].log debuga.log
debugz.log
debug1.log
debug[A-Z].log debugA.log
debugZ.log
debuga.log

Git cũng cho phép bạn thêm nhận xét vào file này, bắt đầu bằng dấu ( # ). Điều này rất hữu ích để tổ chức file hoặc thêm giải thích lý do tại sao một số mẫu nhất định đã được thêm vào file .gitignore.

Hệ thống cấp bậc các file .gitignore

Git thực sự kiểm tra nhiều hơn chỉ một file .gitignore được lưu trữ cục bộ mà từ đó nó biết được các tập tin nào nên bỏ qua. Như chúng ta đã thấy cho đến nay, vị trí phổ biến nhất là đặt một file .gitignore trong thư mục gốc của dự án của bạn. Một tùy chọn khác là có thêm một file .gitignorefile khác được đặt trong một thư mục con trong dự án của bạn. Mặc dù ít phổ biến hơn trong thực tế, nhưng điều này có thể hữu ích cho việc áp dụng luật lệ chung với toàn bộ file trong dự án nhưng có thể sử dụng luật lệ riêng trên thư mục con mà nó chứa đựng quy tắc riêng.

Một tính năng hữu ích khác là tạo ra một tập tin ignore toàn cục. Đây thường là một tập tin.gitignore được đặt trong thư mục home directory của Git

$ touch ~/.gitignore

Nếu cần, bạn có thể thay đổi vị trí của file toàn cục này bằng lệnh sau:

$ git config --global core.excludesFile ~/.gitignore

Nghĩa là bất kỳ mẫu nào được đặt trong file .gitignore toàn cục này phải dành cho loại file mà bạn chắc chắn mình sẽ không bao giờ muốn theo dõi nó, chẳng hạn như .DS_Store hoặc Thumbs.db do OS tự sinh ra. Điều này, giúp bạn dễ dàng hơn trong việc phải thiết lập file .gitignore cho dự án, bạn chỉ cần kiểm tra các file đặc biệt không cần theo dõi trong dự án của mình là đủ vì các file hay gặp đã được chỉ định sẵn trong .gitignore toàn cục.

Commit một file .gitignore

Giả sử bạn có một ngoại lệ đó là bạn muốn tạo ra một file và file nằm trong mẫu bị bỏ qua trong file .gitignore, nhưng vì lý do gì dự án này đặc biệt cần nó và phải commit cho nó. Trong trường hợp như thế này, bạn có một vài lựa chọn:

 - Yêu cầu Git không bỏ qua file này bằng cách thêm một tiền tố ( ! ) trong .gitignore, ví dụ: !.env. Điều này sẽ ghi đè bất kỳ file .gitignore toàn cục hoặc bỏ qua các file trong thư mục cha.
- Sử dụng --force tùy chọn (hoặc -f ) khi thêm các file của bạn vào stagging area, nghĩa là git add .env --force

Làm sao để git cũng không theo dõi luôn file .gitignore nếu bạn muốn. Đơn giản, chỉ cần đặt nó vào chính nó. Nghĩa là thêm ".gitignore" vào trong nội dung file .gitignore

Tổng kết

Trong bài viết này, bạn đã thấy cách Git cung cấp một cơ chế để bạn có thể nói với nó những tập tin nào không nên theo dõi trong repo của mình, giúp bạn khỏi phải theo dõi các tập tin theo cách thủ công. Đây là một tính năng mạnh mẽ cung cấp một cú pháp phong phú, cũng như hệ thống phân cấp để kiểm soát tốt hơn các file nào bị bỏ qua và file nào không.
Bạn có thể xem lại các bài tự học Java 
Tìm hiểu các khóa tự học lập trình 

Tác giả bài viết: Aptech Buôn Ma Thuột

Ý kiến bạn đọc

Theo dòng sự kiện

Bài 5:Một số vấn đề thường gặp khi sử dụng Git và cách khắc phục
Bài 4: Hướng dẫn sử dụng Git - Các lệnh cơ bản cần phải biết
Bài 3: Cách sử dụng Github và làm việc nhóm bằng GitHub
Bài 2: Hướng dẫn cài đặt Git trên Windows và Linux
Bài 1: Git là gì? Cùng khám phá công cụ kiểm soát phiên bản phân tán.

Những tin mới hơn

Bài 7: Git conflicts? Cách xử lý conflict trong khi merge.

Những tin cũ hơn

Bài 5:Một số vấn đề thường gặp khi sử dụng Git và cách khắc phục
Bài 4: Hướng dẫn sử dụng Git - Các lệnh cơ bản cần phải biết
Bài 3: Cách sử dụng Github và làm việc nhóm bằng GitHub
Bài 2: Hướng dẫn cài đặt Git trên Windows và Linux
Bài 1: Git là gì? Cùng khám phá công cụ kiểm soát phiên bản phân tán.