How can I remove those annoying Mac OS X .DS_Store files from a Git repository?
How can I remove those annoying Mac OS X .DS_Store files from a Git repository?
Remove existing .DS_Store files from the repository:
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Add this line:
.DS_Store
to the file .gitignore, which can be found at the top level of your repository (or create the file if it isn't there already). You can do this easily with this command in the top directory:
echo .DS_Store >> .gitignore
Then commit the file to the repo:
git add .gitignore
git commit -m '.DS_Store banished!'
In some situations you may also want to ignore some files globally. For me, .DS_Store is one of them. Here's how:
git config --global core.excludesfile /Users/mat/.gitignore
(Or any file of your choice)
Then edit the file just like a repo's .gitignore. Note that I think you have to use an absolute path.
Sometimes .DS_Store files are there at remote repository, but not visible at your local project folders. To fix this, we need to remove all cached files and add again.
Step 1: Add this to .gitignore file.
# Ignore Mac DS_Store files
.DS_Store
**/.DS_Store
Step 2: Remove the cached files and add again using these commands.
git rm -r --cached .
git add .
git commit -am "Removed git ignored files"
git push -f origin master
Top voted answer is awesome, but helping out the rookies like me, here is how to create the .gitignore file, edit it, save it, remove the files you might have already added to git, then push up the file to Github.
Create the .gitignore file
To create a .gitignore file, you can just touch the file which creates a blank file with the specified name. We want to create the file named .gitignore so we can use the command:
touch .gitignore
Ignore the files
Now you have to add the line which tells git to ignore the DS Store files to your .gitignore. You can use the nano editor to do this.
nano .gitignore
Nano is nice because it includes instructions on how to get out of it. (Ctrl-O to save, Ctrl-X to exit)
Copy and paste some of the ideas from this Github gist which lists some common files to ignore. The most important ones, to answer this question, would be:
# OS generated files #
######################
.DS_Store
.DS_Store?
The # are comments, and will help you organize your file as it grows.
This Github article also has some general ideas and guidelines.
Remove the files already added to git
Finally, you need to actually remove those DS Store files from your directory.
Use this great command from the top voted answer. This will go through all the folders in your directory, and remove those files from git.
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Push .gitignore up to Github
Last step, you need to actually commit your .gitignore file.
git status
git add .gitignore
git commit -m '.DS_Store banished!'
The best way to get rid of this file forever:
Make a global .gitignore file:
echo .DS_Store >> ~/.gitignore_global
Let Git know that you want to use this file for all of your repositories:
git config --global core.excludesfile ~/.gitignore_global
That’s it! .DS_Store will be ignored in all repositories.
In case you want to remove DS_Store files to every folder and subfolder:
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Ignore them by:
echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
delete them using git-rm, and then add .DS_Store to .gitignore to stop them getting added again. You can also use blueharvest to stop them getting created all together
This will remove every .DS_Store file in a directory (including subdirectories)
find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Add this to .gitignore to prevent any DS_Store files in the root directory and every subdirectory from going to git!
**/.DS_Store
From the git docs:
- A leading "**" followed by a slash means match in all directories. For example, "**/foo" matches file or directory "foo" anywhere, the same as pattern "foo". "**/foo/bar" matches file or directory "bar" anywhere that is directly under directory "foo".
I found that the following line from snipplr does best on wiping all .DS_Store, including one that has local modifications.
find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print
--cached option, keeps your local .DS_Store since it gonna be reproduced anyway.
And just like mentioned all above, add .DS_Store to .gitignore file on the root of your project. Then it will be no longer in your sight (of repos).
This will work:
find . -name "*.DS_Store" -type f -exec git-rm {} \;
It deletes all files whose names end with .DS_Store, including ._.DS_Store.
create a .gitignore file using command touch .gitignore
and add the following lines in it
.DS_Store
save the .gitignore file and then push it in to your git repo.
No need to remove .DS_STORE locally
Just add it to .gitignore file
The .gitignore file is just a text file that tells Git which files or folders to ignore in a project.
Commands
nano .gitignore.DS_Store Then click CTRL+X > y > Hit Returngit status To have a last look at your changesgit add .gitignoregit commit -m 'YOUR COMMIT MESSAGE'git push origin masterI made:
git checkout -- ../.DS_Store
(# Discarding local changes (permanently) to a file) And it worked ok!