Cách viết Gitignore Pattern hiệu quả

December 15, 2021

Nếu nàng GIT sinh ra với nhiệm vụ lưu trữ, quản lý version source code. Thì chàng `.gitignore` được sinh ra với trách nhiệm ngược lại: Thiết lập pattern cho những file sẽ không được GIT quản lý.

Với các thư mục chứa các dự án lớn thì dung lượng có khi lên cả TẤN (GB) là chuyện hết sức bình thường, tuy nhiên, không phải tất cả đều quan trọng và cần quản lý chặt chẽ: * Ví dụ các file binary trong quá trình compile. * Như các file log trong quá trình debug. * Như các dependency (cậu này siêu nặng nhé). * Hoặc như các file IDE configuration... Việc ôm đồm các file không cần thiết trên Git không chỉ chiếm không gian repository mà còn gây rối thêm cho các member khác. Nên việc ignore các file này trong mỗi dự án là vô cùng cần thiết. Chúng ta cùng tìm hiểu một vài tip hướng dẫn tạo pattern cho `.gitignore` nhé.

## 1) First Slash vs Last Slash (`/{pattern}` vs `{pattern}/`) Ký tự "/" (slash) ở đầu và cuối pattern thường dễ bị chúng ta bỏ sót khi khai báo các pattern. Việc KHÔNG có khai báo các slash này sẽ cho các kết quả ignore khác nhau. * First Slash - ký tự Slash đầu pattern, nếu có nó, ý nghĩa là pattern này tính từ ROOT DIRECTORY (directory chứa `.gitignore`, thường là root của repository). Nếu pattern không có Root Slash thì git sẽ ignore tất cả path thoả điều kiện CONTAIN pattern này ở vị trí bất kỳ của path. * Last Slash - ký tự Slash cuối pattern, nếu có nó, ý nghĩa là pattern này apply cho DIRECTORY. Nếu không có slash cuối này, pattern sẽ apply cho cả FILE và DIRECTORY. Đến đây, các bạn sẽ nhận ra rằng, tuy thỉnh thoảng chúng ta không để ý đến những slash này, nhưng trường hợp KHÔNG thường có kết quả cover luôn trường hợp CÓ sử dụng slash, dẫn đến kết quả ignore VÔ TÌNH vẫn đúng ý đồ tác giả.
## 2) Directory Pattern `{**}/` Ignore file với path có chứa 0 hay nhiều sub-directory chỉ định. Dấu ** chỉ dùng để match directory. `{sub}/` Ignore file với path có chứa sub-directory chỉ định.
## 3) Name Pattern (`*, ?, [09], [az]`) Name Pattern có thể sử dụng độc lập hoặc kết hợp với Directory Pattern để thoả mãn cả 2 yêu cầu về directory và file name. Name-Pattern gồm các pattern dưới đây. * `{name.type}` ignore file có name và type chỉ định. * Dấu * đại diện cho nhiều ký tự, ví dụ: * `*.{type}` ignore file có type chỉ định. * `{name}.*` ignore file có name chỉ định. * `{name}*.{type}` ignore file với name có postfix chỉ định, type xác định. * Dấu ? đại diện cho 1 ký tự bất kỳ. * [09] đại diện cho 1 ký tự bất kỳ từ 0 --> 9. * [az] đại diện cho 1 ký tự bất kỳ từ a --> z.
Lưu ý: * Dấu (*) có thể sử dụng cho File Name và Directory Name, trong khi (**) chỉ dùng cho Directory Name. * Các Regex (?, [09], [az]) chỉ sử dụng được cho File Name. * Cách và vị trí sử dụng các regex (?, [09], [az]) trong pattern tương tự dấu (*).
## 4) Negative Ignore (`!`) Dấu (!) dùng để cho phép commit các case đặc biệt nếu trước đó đã bị ignore.

// SAMPLE 1
*.log               # ignore tất cả file *.log
!important.log      # cho phép commit pattern important.log

// SAMPLE 2
debug[09].log       # ignore debug0.log, debug1.log,..., debug9.log
debug[!13].log      # cho phép commit pattern debug1.log, debug2.log, debug3.log.

// SAMPLE 3
debug[09].log       # ignore 0,1,2,3,4,...,9
debug[!13].log      # cho phép 1,2,3
debug2.log          # ignore 2 (pattern khai báo sau có độ ưu tiên cao hơn)
                    # => KẾT QUẢ CUỐI: sẽ ignore 0,2,4,5,...9
## 5) Sample
// ignore file has specific extension
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

// ignore files by specific directory's name
node_modules/
build/
xcuserdata/ ## XCode's User settings

// ignore file by specific name, directory's name.
// In fact, if you make file with name .npm or .env, Git also ignore them.
.npm
.env

// ignore file in specific directory from ROOT.
/.npm/

// ignore file's name with "png" postfix and dir-path with "fastlane/screenshots/"
fastlane/screenshots/**/*.png