Skip to content

Commit 03c7d1c

Browse files
Merge pull request #43 from phuse-org/blog-understanding-gitignore
Understanding .gitignore #42
2 parents 41d6cdf + 18a3103 commit 03c7d1c

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
---
2+
title: "Understanding gitignore: A Simple Guide"
3+
author: "rajwanur"
4+
date: "2025-09-04"
5+
categories: [git, tools, gitignore]
6+
toc: TRUE
7+
toc-title: "Table of contents"
8+
toc-depth: 3
9+
---
10+
11+
If you are working with Git but find yourself dealing with unnecessary files cluttering your repository, `.gitignore` is a tool that can help. Let's explore what it does in plain terms.
12+
13+
## What is gitignore?
14+
15+
`.gitignore` is simply a text file that tells **Git** which files or folders to ignore in your project. It works like an instruction list for version control - when Git sees something mentioned in this file, it pretends that file doesn't exist and will not include it in tracking changes.
16+
17+
Think of it as creating a "do not pack" list before the travel. `.gitignore` helps programmers avoid committing files they don't want to track. It also helps programmers exclude the files that don't need to be versioned.
18+
19+
## The Problem It Solves
20+
21+
When working with code - especially languages like `SAS`, `R`, or `Python` - we often generate temporary files:
22+
23+
- Log files showing execution results
24+
- Temporary output files
25+
- Large datasets created during processing
26+
- Configuration files specific to the local machine
27+
- Compiled binaries and dependencies
28+
29+
These files can clutter the repository, making it harder to see actual code changes. They also unnecessarily increase repository size, which can slow down operations.
30+
31+
`.gitignore` solves this by automatically excluding these unwanted files from version control without someone having to manually specify each time.
32+
33+
## How It Works
34+
35+
The `.gitignore` file uses simple patterns to match filenames:
36+
37+
- `*.log` - ignores all files ending with .log
38+
- `temp/` - ignores any folder named temp
39+
- `/build/` - ignores a build folder in the root directory
40+
- `*.tmp` - ignores all temporary files with extension `.tmp`
41+
- `!*.sas` - **do not ignore** all files ending with .sas
42+
- `# This is a comment` - Anything after a # is a comment and is ignored
43+
44+
For complete syntax please refer to the [official documentation](https://git-scm.com/docs/gitignore).
45+
46+
These rules are applied whenever Git checks for changes, so you only see relevant modifications.
47+
48+
## About Multiple `.gitignore` Files
49+
50+
It's worth noting that it is possible to have multiple `.gitignore` files throughout the project. `.gitignore` files are not limited to just one in the root directory. When we place a `.gitignore` file in a subfolder, Git applies those specific ignore patterns only within that folder.
51+
52+
This is particularly useful for tools like R's renv package or Python's virtual environments, which might have their own temporary files and configurations that should be ignored at different levels of project structure.
53+
54+
```{mermaid}
55+
---
56+
config:
57+
layout: auto
58+
---
59+
flowchart LR
60+
A[🏠 my-r-project/] --> B[📄 .gitignore<br/>ROOT LEVEL]
61+
A --> C[📁 R/]
62+
A --> D[📁 data/]
63+
A --> G[📁 vignettes/]
64+
A --> J[📁 docs/]
65+
A --> N[📄 README.md]
66+
67+
B --> B1[".Rproj.user/<br/>*.Rproj<br/>.Rhistory<br/>.RData<br/>.Ruserdata<br/>docs/<br/>Meta/<br/>doc/<br/>*.tar.gz"]
68+
69+
C --> C1[📄 utils.R]
70+
C --> C2[📄 main_functions.R]
71+
C --> C3[📄 plot_functions.R]
72+
73+
D --> D1[📄 .gitignore<br/>DATA SPECIFIC]
74+
D --> D2[📄 raw_data.csv]
75+
D --> D3[📄 processed_data.rda]
76+
D1 --> D1A["*.csv<br/>*.xlsx<br/>raw_*<br/>temp_*<br/>backup_*"]
77+
78+
G --> G1[📄 introduction.Rmd]
79+
G --> G2[📄 .gitignore<br/>VIGNETTE SPECIFIC]
80+
G2 --> G2A["*.html<br/>*.pdf<br/>*_cache/<br/>*_files/<br/>figure-html/"]
81+
82+
83+
J --> J1[📄 .gitignore<br/>DOCS SPECIFIC]
84+
J --> J2[📁 _site/]
85+
J --> J3[📄 pkgdown.yml]
86+
J1 --> J1A["_site/<br/>*.html<br/>search.json<br/>sitemap.xml"]
87+
88+
style A fill:#e1f5fe
89+
90+
classDef gitignoreFile fill:#ff9800,stroke:#e65100,stroke-width:2px,color:#fff
91+
class B,D1,F3,G2,H2B,H3B,I2,J1,K2 gitignoreFile
92+
```
93+
94+
## Different Ways to Use gitignore
95+
96+
### Basic Setup
97+
98+
For most projects, create a `.gitignore` file in your project's root directory with patterns specific to your language or tools:
99+
100+
```bash
101+
# Ignore log files
102+
*.log
103+
*.tmp
104+
105+
# Ignore compiled output
106+
/bin/
107+
/dist/
108+
109+
# Ignore IDE configuration files
110+
.idea/
111+
.vscode/
112+
```
113+
114+
### Project-Specific Rules
115+
116+
Different programming languages often have different temporary files:
117+
118+
- For SAS programs:
119+
```bash
120+
# To exclude SAS log, lst, and sas7bdat files
121+
*.log
122+
*.lst
123+
*.sas7bdat
124+
```
125+
126+
- For R projects:
127+
```bash
128+
# To exclude R temporary files
129+
.RData
130+
.Rhistory
131+
.Rproj.user
132+
*.Rproj
133+
```
134+
135+
- For Python projects:
136+
```bash
137+
__pycache__/
138+
*.pyc
139+
.env
140+
.pytest_cache
141+
.venv/
142+
```
143+
144+
### Global Ignore Patterns
145+
146+
We can set up global ignore patterns that apply to all our repositories:
147+
148+
```bash
149+
git config --global core.excludesfile ~/.gitignore_global
150+
```
151+
152+
Then add common patterns in `.gitignore_global` file located at `~/` (home directory) that should be ignored across all projects.
153+
154+
## Important Note
155+
156+
While `.gitignore` is powerful, it has an important feature: it won't ignore files that are already included (staged or committed) in Git. If a file is added to the staging area with `git add`, Git will continue tracking it even if it matches patterns in existing `.gitignore` file.
157+
158+
If such a file is already included and needs to be excluded from version control, this need to explicitly remove it from tracking using:
159+
```bash
160+
git rm --cached filename
161+
```
162+
163+
This removes the file from version control but leaves it on the local filesystem.
164+
165+
## Best Practices
166+
167+
1. **Create early**: Add `.gitignore` at the beginning of a project
168+
2. **Commit it**: Make sure `.gitignore` itself is version controlled
169+
3. **Share with team**: Everyone working on a project should use the same rules
170+
4. **Review occasionally**: As your project evolves, update your ignore patterns
171+
5. **Exclude all/include some**: To avoid new file types from being tracked, exclude all and include what is expected
172+
173+
## Resources
174+
175+
- [`.gitignore` syntax](https://git-scm.com/docs/gitignore)
176+
- [Understanding `.gitignore`](https://www.atlassian.com/git/tutorials/saving-changes/gitignore)
177+
- [Automatically Generate `.gitignore` Files](https://www.gitignore.io/)
178+
179+
180+
## Conclusion
181+
182+
`.gitignore` is a simple but powerful tool that helps maintain clean repositories by excluding unnecessary files. It's not magical - just practical configuration that saves time and reduces clutter in version control systems.
183+
184+
If you haven't used `.gitignore` before, give it a try on your next project. You'll likely find yourself wondering how you ever worked without it!

0 commit comments

Comments
 (0)