ChatGPT解决这个技术问题 Extra ChatGPT

.gitignore all the .DS_Store files in every folder and subfolder

I've added .DS_Store to the .gitignore file, but it seems that it is only ignoring .DS_Store in the root directory, not in every folder and subfolder.

How do I fix this?

How exactly did you add it to .gitignore? It should work in all directories (does for me).
Its working for me as well. I also tried when its at the end of the file, if you have to have a (platform specific) newline but that didn't change that .DS_Store directories within any part of the hierarchy was still ignored.
The question as I understand it was: How to easily ignore all occurrences of .DS_Store in all subdirectories without manually doing this in every subdirectory. I had the same problem. The below answer shows how to solve it (the last 2 paragraphs).

b
blkpingu

I think the problem you're having is that in some earlier commit, you've accidentally added .DS_Store files to the repository. Of course, once a file is tracked in your repository, it will continue to be tracked even if it matches an entry in an applicable .gitignore file.

You have to manually remove the .DS_Store files that were added to your repository. You can use

git rm --cached .DS_Store

Once removed, git should ignore it. You should only need the following line in your root .gitignore file: .DS_Store. Don't forget the period!

git rm --cached .DS_Store

removes only .DS_Store from the current directory. You can use

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

to remove all .DS_Stores from the repository.

Felt tip: Since you probably never want to include .DS_Store files, make a global rule. First, make a global .gitignore file somewhere, e.g.

echo .DS_Store >> ~/.gitignore_global

Now tell git to use it for all repositories:

git config --global core.excludesfile ~/.gitignore_global

This page helped me answer your question.


Last 2 paragraphs answers this question. Thanks.
´´git rm --cached .DS_Store´´ removes only one .DS_Store from the current directory. Use ´´find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´ to remove all .DS_Stores from the repo
A list of other common files to ignore might be handy
Bad idea to use global rule IMO: Trying to maintain global configs across multiple users/machines never works- you want the rules governing your repo in the repo itself. Agree with this
I don't agree with you. (Even though I upvoted your comment since I think it's insightful.) If we do global, then every mac user needs to do that, but only once. If we do repository wide, then we need to do that for every repository. I don't know about you, but I make new repos all the time. By doing it globally, one solves the problem once and for all.
r
ronald8192

Add**/.DS_Store into .gitignore for the sub directory

If .DS_Store already committed:

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

To ignore them in all repository: (sometimes it named ._.DS_Store)

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

still uploaded into my repo ?
@FreddySidauruk use git rm --cached your_file first
@FreddySidauruk Should be find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch, from: stackoverflow.com/questions/18393498/…
It seems adding -f is needed if you have open files in the relavent folders: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
d
drjorgepolanco

If .DS_Store was never added to your git repository, simply add it to your .gitignore file.

If you don't have one, create a file called

.gitignore

In the root directory of your app and simply write

**/.DS_Store

In it. This will never allow the .DS_Store file to sneak in your git.

But, if it's already there, write in your terminal:

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

then commit and push the changes to remove the .DS_Store from your remote repo:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

And now add .DS_Store to your .gitignore file, and then again commit and push with the 2 last pieces of code (git commit..., git push...)


Why double asterisk? What does that mean?
@MilanG it's a keyword that basically means 'search in this directory and all subdirectories'.
Not sure that is a perfect explanation of what the double asterisk stands for. It is a wildcard. Could * or ** depending on what you want to achieve. It is a way of telling the shell how to navigate directories. This stackoverflow answer explains it fully stackoverflow.com/a/28199633/4092170
** will never match hidden (./) directories : facelessuser.github.io/wcmatch/glob
worked like a charm. you have to do it step by step as indicated here, otherwise it won't work
C
Community

Your .gitignore file should look like this:

# Ignore Mac DS_Store files
.DS_Store

As long as you don't include a slash, it is matched against the file name in all directories. (from here)


it's still uplaoded into repo
@FreddySidauruk then you have to run git rm --cached path/to/file/here
s
stevec

Simply place this on a new line in .gitignore

**/.DS_Store

From git documentation

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".


As noted in the documentation you quote, **/.DS_Store is just a more complicated way of writing .DS_Store. You only need the double star when you want to gitignore a specific path pattern, regardless of where it occurs. For example **/foo/.DS_Store would hide .DS_Store files only if found in a foo subdirectory (regardless of where foo is).
@orlp has it always been like that? I would have sworn I'd added .DS_Store to .gitignore a million times, only to have .DS_Store appear in subdirectories. After testing your information it appears you're absolutely right. It changes my thinking on this SO question. But also more generally: there's a (high) risk of accidentally ignoring files in subdirectories that happen to be the same name as another that is intentionally ignored elsewhere. Seems like a bad (albeit convenient) for git to behave like that. Thanks for pointing it out.
t
travelingbones

Step 1, delete all the *.DS_store files. One can run

git rm -f *.DS_Store

but be aware that rm -f can be a bit dangerous if you have a typo! Step two: add

*.DS_Store
.DS_Store

to .gitignore. This worked for me!


J
Jacob

Add *.DS_Store to your .gitignore file. That works for me perfectly


A
Andrew Wilhelm

You can also add the --cached flag to auco's answer to maintain local .DS_store files, as Edward Newell mentioned in his original answer. The modified command looks like this: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch ..cheers and thanks!


v
vishnu

Step :1)Remove the existing files using this command

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

Step : 2)Add .DS_Store in your .gitignore file

Step :3) Commit your changes in .gitignore git add .gitignore git commit -m "removed .DS_Store"


m
mate.gvo

$ git rm ./*.DS_Store - remove all .DS_Store from git $ echo \.DS_Store >> .gitignore - ignore .DS_Store in future

commit & push


this worked for me. Thank You.
K
Kiran Jasvanee

You should add following lines while creating a project. It will always ignore .DS_Store to be pushed to the repository.

*.DS_Store this will ignore .DS_Store while code commit.
git rm --cached .DS_Store this is to remove .DS_Store files from your repository, in case you need it, you can uncomment it.

## ignore .DS_Store file.
# git rm --cached .DS_Store
*.DS_Store