เรื่องของ gitignore

gitignore

ในยุคสมัยใหม่แห่งการเขียน Code แทบทุกคนจะต้องรู้จัก Git ซึ่งเป็นตัว version control ของ Source code ซึ่งทำหน้าที่ดูว่าไฟล์ไหนถูกเปลี่ยน ไฟล์ไหนเพิ่ม ไฟล์ไหนหายไป และทำ version ของ source code เพื่อให้เราสามารถย้อนไปย้อนกลับตัว source code ได้ ซึ่งเป็นที่นิยมมากในปัจจุบัน เพราะใช้งานง่าย ฟรี และมี Community มากมายมหาศาล แล้วตัว gitignore มันคืออะไรล่ะ ตัว gitignore ก็คือไฟล์ที่ชื่อ .gitignore ซึ่งเป็นตัวบอกตัวโปรแกรม git ว่า “เราจะไม่สนใจไฟล์เหล่านี้” ย้ำอีกครั้งว่า “เราจะไม่สนใจไฟล์เหล่านี้” เราจะไม่ track version มัน

พูดมาถึงตรงนี้ก็คงจะมีคำถามว่ามีไปทำไม คำตอบคือ Git นัั้นต้องการเก็บ source code ไม่ได้ต้องการเก็บอย่างอื่น แต่ในโปรเจคที่เรากำลังพัฒนานั้นมันมีหลายอย่างเช่น Lib ไฟล์ที่ compile ไปแล้ว ซึ่งเวลาเราสั่งกับ git ว่ามีไฟล์ไหนเปลี่ยนแปลงหรือยังไม่ได้ tracking เข้า version มันจะแสดงให้เราเห็นด้วย ซึ่งบางทีมันสร้างความรำคาญสำหรับคนที่รู้ว่ามันไม่ใช่ไฟล์ที่ต้องการแต่ดันมาแสดงให้ดู แต่ร้ายกว่าคือคนที่พึ่งหัดเขียนหรือไม่รู้ เขาจะทำการ Add ไฟล์พวกนี้เข้าไปใน git ด้วย ทำให้ตัว repo มันใหญ่ ซึ่งจริงๆ source code อาจจะมีขนาดแค่ 50 KB เท่านั้น ตอนผมเริ่มหัดใช้ git ใหม่ก็เอาไฟล์ lib ขึ้นไปบน git ด้วย เวลา clone ทีนี่รอ 10 กว่านาที

แล้วเราจะต้องมานั่งหาเหรอว่าเราจะไม่เอาไฟล์อะไรบ้าง คำตอบคือต้องครับแต่ไม่มากหรือยากเย็นอะไรขนาดนั้น เพราะมนุษย์โลกจำนวนหนึ่งได้สร้าง Tool ขึ้นมาเพื่อ Gen ไฟล์ gitignore ให้กับเรา ซึ่งสามารถไปใช้งานได้ที่ https://www.gitignore.io/ โดย Tool ตัวนี้จะให้เราใส่ ภาษา หรือ IDE ที่ใช้พัฒนา ตัว Tool จะสร้างไฟล์ .gitnore ออกมาให้ จากนั้นเราก็แค่เอาไปวางที่ directory ที่ source code โปรเจคเราอยู่ เพียงเท่านี้ก็ช่วยเราจัดการกับพวกไฟล์พื้นฐานที่เราจะไม่เอาเข้า git ที่เหลือเราก็ไปเพิ่มเอาเองว่าจะไม่เอาไฟล์ไหนขึ้น git อีก

ตัวอย่างการใช้งาน

กรณีเติมในช่วงว่างเป็น Node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

# Created by https://www.gitignore.io/api/node

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env


# End of https://www.gitignore.io/api/node

"สิ่งที่ผมเขียนขึ้นเป็นเพียงความรู้และความเข้าใจของบุคคลเพียงบุคคลเดียว ดังนั้นอย่าเพิ่งเชื่อในสิ่งที่ผมเขียนและอธิบาย ลองทำความเข้าใจว่ามันเป็นจริงอย่างนั้นไหมและลองหาแหล่งอ้างอิงอื่นๆว่าเขามีแนวคิดอย่างไร เรื่องการ Design และวิธีการใช้งานไม่มีถูกไม่มีผิดมีแต่เหมาะสมกับงานนั้นไหม"