How can I Remove .DS_Store files from a Git repository?

Viewed 893116

How can I remove those annoying Mac OS X .DS_Store files from a Git repository?

28 Answers

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:


In case of already committed DS_Store:

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

Step 1

This will remove every .DS_Store file in a directory (including subdirectories)

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Step 2

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
  • Write .DS_Store Then click CTRL+X > y > Hit Return
  • git status To have a last look at your changes
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master

I made:

git checkout -- ../.DS_Store

(# Discarding local changes (permanently) to a file) And it worked ok!

Related