Introduction
Git, a powerful version control system, doesn’t inherently track empty directories. This is because Git focuses on tracking files and their changes, and directories themselves don’t contain any content to version. However, there are scenarios where you might want to include an empty directory in your repository – for example, to represent a future directory structure, or as a placeholder for uploaded files. This tutorial explains how to achieve this using .gitignore
and a special technique.
The Problem: Git and Empty Directories
By default, Git ignores empty directories. If you create a directory and try to commit it without any files inside, Git will simply not track it. This behavior can be frustrating if you need to maintain the directory structure for organizational purposes or to indicate a planned future state.
Solution: Using .gitignore and a Placeholder File
The most common and reliable method to track an empty directory involves leveraging the .gitignore
file along with a placeholder file. Here’s how it works:
-
Create the Directory: Ensure the empty directory exists in your repository.
-
Create a Placeholder File: Inside the empty directory, create a file that will be tracked by Git. A common convention is to name this file
.gitkeep
. The file’s content doesn’t matter; it can be empty..gitkeep
is simply a signal to Git that this directory should be tracked. -
Configure .gitignore: Create or modify your
.gitignore
file at the root of your repository. Add the following lines:# Ignore everything in the directory your_directory/* # Except the .gitkeep file !your_directory/.gitkeep
Replace
your_directory
with the actual name of the directory you want to track. -
Add and Commit: Stage and commit both the
.gitkeep
file and the.gitignore
file:git add your_directory/.gitkeep git add .gitignore git commit -m "Track empty directory with .gitkeep"
Explanation
Let’s break down how this solution works:
your_directory/*
tells Git to ignore all files and subdirectories withinyour_directory
.!your_directory/.gitkeep
is an exception to the previous rule. The!
negates the ignore rule, telling Git to include the.gitkeep
file in version control.
Because the .gitkeep
file is tracked, Git will now recognize the existence of the your_directory
even though it is empty. The directory will be included in your repository.
Alternative: Ignoring All Within, Including .gitignore
If you want to ignore all contents of a directory including any .gitignore
file within it, while still tracking the directory itself, you can use the following .gitignore
pattern inside the directory:
*
!.gitignore
This ensures that all files and subdirectories are ignored except for the .gitignore
file itself. Remember to git add .gitignore
to track the .gitignore
file. This approach is useful when you want to initialize a directory with a .gitignore
but keep it empty for a specific reason.
Best Practices
- Use
.gitkeep
consistently: This filename convention is widely recognized and improves code readability. - Keep it simple: Avoid overly complex
.gitignore
patterns. The simpler the rules, the easier they are to understand and maintain. - Test your rules: After modifying your
.gitignore
file, verify that the intended files and directories are being ignored or tracked as expected. You can usegit status
to check.