Ignoring any 'bin' directory on a git project
Asked Answered
I

16

1469

I have a directory structure like this:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Inside main and tools, and any other directory, at any level, there can be a 'bin' directory, which I want to ignore (and I want to ignore everything under it too). I've tried each of these patterns in .gitignore but none of them work:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Can anyone help me out? The first pattern (the one I think should be working) works just fine if I do this:

/main/**/bin/**/*

But I don't want to have an entry for every top-level directory and I don't want to have to modify .gitignore every time I add a new one. There are also files and directories that have the substring 'bin' in their names, which I want to keep.

This is on Windows using the latest msysgit.

Intoxicated answered 24/9, 2009 at 9:13 Comment(5)
Probably somebody will find as helpful: if you have few repositories and each has the same .gitignore file, you can put it into "common" location and launch > git config --global core.excludesfile ~/.gitignore_global The last parameter is path to the common location. P.S. I'm new to git and not sure if that is 'best practice' recommendation. So please let me know if you should not want to do that. Thank you.Bagasse
The ** syntax seems now (March 2013, git 1.8.2) officially documented: see my answer belowSiccative
If anyone wants to read the most up-to-date version of the actual manual page, see gitignore(5) Manual Page.Roseola
friendlier option if you're tired of reading essays for one line's worth of information atlassian.com/git/tutorials/saving-changes/…Oruro
Possibly worth noting, when creating a global ignore file, it's beneficial to name it ~/.cvsignore. Other version control systems use this name, making it even more "global".Vaporing
N
2137

Before version 1.8.2, ** didn't have any special meaning in the .gitignore. As of 1.8.2 git supports ** to mean zero or more sub-directories (see release notes).

The way to ignore all directories called bin anywhere below the current level in a directory tree is with a .gitignore file with the pattern:

bin/

In the man page, there an example of ignoring a directory called foo using an analogous pattern.

If you already have any bin folders in your git index which you no longer wish to track then you need to remove them explicitly. Git won't stop tracking paths that are already being tracked just because they now match a new .gitignore pattern. Execute a folder remove (rm) from index only (--cached) recursivelly (-r). Command line example for root bin folder:

git rm -r --cached bin
Nonanonage answered 24/9, 2009 at 9:35 Comment(10)
Starting with git 1.8.2, git will accept ** in .gitignore files (source: 1.8.2 changelog)Tiki
is bin the same of bin/ ?Properly
@Nisba, they are different, bin will ignore files named bin, while bin/ is for directories named binBlunger
since I fell over this: folder name in git-command IS case sensitive :) "bin !=Bin" - maybe I spare someone a few minutes by this hint :)Morpheus
In windows10 you cannot create a .gitignore file, you have to create a gitignore.txt and then run ren gitignore.txt .gitignore in command prompt to create this fileDuncandunce
So what is the difference between **.thing/ and .thing/ in top level gitignore assuming using git 1.8.2 or greater?Flapdoodle
@Duncandunce not entirely true. You can actually create a .gitignore file if you have displaying file extensions enabled. At that point you simply remove the ".txt" from the end when naming the file.Also, when renaming, it only works if you do a "Save As" in whatever program, and either surround .gitignore in quotes for the filename, or select "All files (.)" in the "Save as type" dropdown.Chancery
Is this the same for any file? Meaning if I had a file named "foo.txt" that I wanted to ignore anywhere. I could just put foo.txt/ into my .gitignore and it would be ignored anywhere?Carrico
Are **/bin/ and bin/ equal?Stephen
*I actually had to do git rm -r --cached **/binEdd
H
531

The .gitignore of your dream seems to be:

bin/

on the top level.

Helprin answered 24/9, 2009 at 9:16 Comment(2)
put it in gitignore_globalPraise
@GAlexander, why would one want to globally ignore bin/ directories? They often have versioned content. And global ignore will not affect other users of the repository.Helprin
C
297

I think it is worth to mention for git beginners:

If you already have a file checked in, and you want to ignore it, Git will not ignore the file if you add a rule later. In those cases, you must untrack the file first, by running the following command in your terminal:

git rm --cached

So if you want add to ignore some directories in your local repository (which already exist) after editing .gitignore you want to run this on your root dir

git rm --cached -r .
git add .

It will basically 'refresh' your local repo and unstage ignored files.

See:

http://git-scm.com/docs/git-rm,

https://help.github.com/articles/ignoring-files/

Colfin answered 13/5, 2015 at 8:54 Comment(1)
if I usually do a git add -A on my commits, can I use this instead? and can I replace the dot with -A on the first line too?Perseverance
S
76

The ** never properly worked before, but since git 1.8.2 (March, 8th 2013), it seems to be explicitly mentioned and supported:

The patterns in .gitignore and .gitattributes files can have **/, as a pattern that matches 0 or more levels of subdirectory.

E.g. "foo/**/bar" matches "bar" in "foo" itself or in a subdirectory of "foo".

In your case, that means this line might now be supported:

/main/**/bin/
Siccative answered 23/4, 2013 at 9:20 Comment(0)
A
51
[Bb]in/

matches both upper and lower case

Amygdalate answered 30/8, 2013 at 5:32 Comment(3)
[B]in/ to be the only upper caseArchle
How to let only Bin folder ignore and let bin commit to git? [B]in/ will both commit Bin and bin.Archle
This should do it, @Gank: Bin/ !bin/Childers
B
42

Step 1: Add following content to the file .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Step 2: Make sure take effect

If the issue still exists, that's because settings in .gitignore can only ignore files that were originally not tracked. If some files have already been included in the version control system, then modifying .gitignore is invalid. To solve this issue completely, you need to open Git Bash or Package Manager Console (see screenshot below) to run following commands in the repository root folder.

git rm -r --cached .
git add .
git commit -m "Update .gitignore"

PM console Then the issue will be completely solved.

Basidiospore answered 3/6, 2018 at 6:46 Comment(0)
B
37

I didn't see it mentioned here, but this appears to be case sensitive. Once I changed to /Bin the files were ignored as expected.

Blest answered 8/10, 2009 at 22:0 Comment(2)
This isn't an answer to the original question which was explicitly about bin, not Bin.Nonanonage
Though not an answer, it does add to the completeness for others searching on the same issue (myself, just now).Scottiescottish
S
27

[Bb]in will solve the problem, but... Here a more extensive list of things you should ignore (sample list by GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Salangi answered 3/1, 2015 at 0:23 Comment(1)
Note: Stuff like this should be in your GLOBAL gitignore (usually in your home directory.) The project gitignore should only ignore things specific to your project (i.e. .o files for a C app.)Lanellelanette
R
19

If you're looking for a great global .gitignore file for any Visual Studio ( .NET ) solution - I recommend you to use this one: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK it has the most comprehensive .gitignore for .NET projects.

Reaction answered 30/7, 2015 at 14:33 Comment(1)
This doesn't really answer the question, but it's exactly what I was looking for.Gadmon
S
18

Literally none of the answers actually worked for me; the only one that worked for me was (on Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
Shopping answered 16/7, 2018 at 17:28 Comment(1)
Did that ignore all folders named bin in the sub-directories as well?Aquacade
S
7

for 2.13.3 and onwards,writing just bin in your .gitignore file should ignore the bin and all its subdirectories and files

bin

Superlative answered 3/8, 2017 at 16:41 Comment(0)
L
5

As a notice;

If you think about .gitignore does not work in a way (so added foo/* folder in it but git status still showing that folder content(s) as modified or something like this), then you can use this command;

git checkout -- foo/*

Ludlow answered 17/2, 2015 at 9:33 Comment(0)
G
4

Adding **/bin/ to the .gitignore file did the trick for me (Note: bin folder wasn't added to index).

Glyptography answered 14/5, 2017 at 12:58 Comment(0)
B
2

In addition to @CB Bailey's answer:

I tried to remove multiple folders (in subfolders) named et-cache (caching folder from Wordpress theme) from the index and from being tracked.

I added

et-cache/

to the .gitignore file. But

git rm -r --cached et-cache

resulted in an error:

fatal: pathspec 'et-cache' did not match any files

So the solution was to use powershell:

Get-ChildItem et-cache -Recurse |% {git rm -r --cached $_.FullName}

This searches for all subfolders named et-cache. Each of the folders path (fullname) is then used to remove it from tracking in git.

Bogey answered 14/1, 2021 at 11:9 Comment(0)
L
1

If the pattern inside .gitignore ends with a slash /, it will only find a match with a directory.

In other words, bin/ will match a directory bin and paths underneath it, but will not match a regular file or a symbolic link bin.


If the pattern does not contain a slash, like in bin Git treats it as a shell glob pattern (greedy). So best would be to use simple /bin.

bin would not be the best solution for this particular problem.

Licit answered 29/1, 2019 at 19:34 Comment(1)
Did you mean 'begin with' a /?Aquacade
P
0

In my case encoding of gitignore file was problematic, check if it is UTF-8

Peepul answered 25/1, 2020 at 20:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.