What are the differences between .gitignore and .gitkeep? Are they the same thing with a different name, or do they both serve a different function?
I don't seem to be able to find much documentation on .gitkeep.
What are the differences between .gitignore and .gitkeep? Are they the same thing with a different name, or do they both serve a different function?
I don't seem to be able to find much documentation on .gitkeep.
.gitkeep isn’t documented, because it’s not a feature of Git.
Git cannot add a completely empty directory. People who want to track empty directories in Git have created the convention of putting files called .gitkeep in these directories. The file could be called anything; Git assigns no special significance to this name.
There is a competing convention of adding a .gitignore file to the empty directories to get them tracked, but some people see this as confusing since the goal is to keep the empty directories, not ignore them; .gitignore is also used to list files that should be ignored by Git when looking for untracked files.
README file in the otherwise empty subdirectory that contains a bit of information about what that subdirectory is going to be used for? It seems confusing to have a file called .gitkeep that is not actually part of git..gitignore file with two lines: * and !.gitignore is more than enough clarity to convey what is going on. If more elaboration is needed, add a comment to the top of the file using the # syntax..keep files instead of .gitkeep to preserve these empty folders, since git is not the only source control system that does not track empty folders. More details here: github.com/rails/rails/issues/2800.gitkeep is just a placeholder. A dummy file, so Git will offer to track that file, since Git tracks only files (blob objects).
When tracked and checked out, Git will create the whole path of that file (referenced via commit and tree objects).
Unless tracked, Git will show it as untracked in the git-work-tree (no objects yet).
If you want an empty directory and make sure it stays 'clean' for Git, create a .gitignore containing the following lines within:
# .gitignore sample # Ignore all files in this dir... /* # ... except for this one. !/.gitignore If you desire to have only one type of files being visible to Git, here is an example how to filter everything out, except .gitignore and all .txt files:
# .gitignore to keep just .txt files # Filter everything... /* # ... except the .gitignore... !/.gitignore # ... and all text files. !/*.txt ! in front of .gitignore ? Is that in order to escape the dot ?! negates the following part, like it usually does in programming.!.gitignore in a git ignore file, either add the file then edit it, or force add it with appropriate contents ("*" to ignore everything, or nothing to simply make sure the folder exists) further example.Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked. ------ If it is not, and you do not do a forceful add, you might forget about it. In trivial cases, no problem, but if it is a bigger file you might be upset. Using !.gitignore prevents you from shooting yourself in your foot. I prefer it, having burned myself in the past..gitignore is a text file comprising a list of files in your directory that git will ignore or not add/update in the repository.
.gitkeep Since Git removes or doesn't add empty directories to a repository, .gitkeep is sort of a hack (I don't think it's officially named as a part of Git) to keep empty directories in the repository.
Just do a touch /path/to/emptydirectory/.gitkeep to add the file, and Git will now be able to maintain this directory in the repository.
.gitignores as you want, if you do not want to specify the full path to every folder every time..gitkeep file but it will not track empty directories, Only folder track where .gitkeep file exist. why so ?.gitignores save you from specifying the full path to every folder every time? I think I'm missing something obvious.Many people prefer to use just .keep since the convention has nothing to do with git.
A file .gitignore is used to tell Git which files and folders it should ignore. Often, these files are build artefacts, temporary files, or other types of files that don't belong in the repository. Git will disregard any directory or file that fits a pattern in the .gitignore file.
Example:
# Ignore .DS_Store files .DS_Store # Ignore build artifacts build/ # Ignore log files *.log Contrarily, a .gitkeep file is utilised in Git to maintain a directory that would otherwise be empty. Git does not by default track empty folders, thus you must add a .gitkeep file to that directory if you wish to keep it in your repository. The filename is more significant than the file's actual contents.
Example of .gitkeep file
# This file is used to keep the directory empty in Git In summary. The .gitignore command is used to tell Git which files and folders to ignore. To maintain a Git directory that would otherwise be empty, use .gitkeep. They are distinct from one another and have different functions.
.gitkeep is not a git feature. This just became common practice. You can call the file whatever you want, because as long as there is at least on file in a folder, the folders will be tracked too..gitignore is all about ignoring files and .gitkeep is a simple placeholder
| Aspect | .gitignore | .gitkeep |
|---|---|---|
| Purpose | Tells Git which files and directories to ignore (exclude) from version control | A placeholder file often used to ensure an otherwise empty directory is included in Git |
| Scenario | List patterns or specific filenames that should not be tracked by Git (e.g., build artifacts) | Create a file named .gitkeep inside an empty folder so Git will include that folder |
| How It Works | The patterns in .gitignore match files and folders, so Git ignores them when you commit | .gitkeep is tracked like a normal file but its content is usually blank |
| Impact on Files | Allows you to configure which files remain untracked, so they never appear in commits | Ensures a directory (which might otherwise remain empty) is kept in the repository |
| Scope | Affects any files matching the patterns declared in that .gitignore | Only acts as a placeholder file in the directory where it is placed |
| Usage | Avoid cluttering the repository with OS or build files like node_modules/ or *.log | Keep folders like logs/ or temp/ in Git, even if the folder is empty in your repo |
This is not an answer to the original question "What are the differences between .gitignore and .gitkeep?" but posting here to help people to keep track of empty dir in a simple fashion. To track empty directory and knowling that .gitkeep is not official part of git,
just add a empty (with no content) .gitignore file in it.
So for e.g. if you have /project/content/posts and sometimes posts directory might be empty then create empty file /project/content/posts/.gitignore with no content to track that directory and its future files in git.
If you want to ignore everything in a subdirectory but have the subdirectory itself (and for that the .gitkeep file) added to Git, you have to add this to .gitignore:
build/* !build/.gitkeep This means ignore everything under the build directory, but exclude .gitkeep from the ignore pattern.
There are two files: .gitignore and .gitkeep serve different purposes in Git:
1. .gitignore :
- A configuration file that tells Git which files/folders to ignore
- Prevents specified files from being tracked by Git
For example:
node_modules/
.env
.DS_Store
build/
2. .gitkeep :
- Not an official Git feature
- A convention used to track empty directories
- Git doesn't track empty folders by default
For example:
Basiclly, We will use them like below purpose:
- .gitignore tells Git what NOT to track
- .gitkeep is a workaround to force Git to track empty directories