Nathaniel Elkins
Nathaniel Elkins

Reputation: 729

Git is tracking directories and will not ignore them

I must have read at least 50 StackOverflow questions and answers that say that Git cannot track directories. And yet, that is exactly what seems to be happening.

I created a project (.NET, on Windows), and added and committed all the files prior to adding a .gitignore. Realizing my mistake later on, I git rm -r --cached :/ everything, added this .gitignore, and the re-added and committed my files. The thing is, git still tracks my obj and bin folders even though they seem to be ignored in the .gitignore.

Here are the relevant lines from the .gitignore:

[Bb]in/
[Oo]bj/
bin/**
obj/**

One or two of those might not make sense, I'm not totally familiar with .gitignore rules and was just trying to see what would stick.

Here's what I get for git status:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    src/main/dotnet/ETB/ETB.Droid/bin/
    src/main/dotnet/ETB/ETB.Droid/obj/
    src/main/dotnet/ETB/ETB.iOS/bin/
    src/main/dotnet/ETB/ETB.iOS/obj/
    src/main/dotnet/ETB/ETB/bin/
    src/main/dotnet/ETB/ETB/obj/
    src/main/dotnet/packages/

This is even after I do something like git rm -r --cached .\src\main\dotnet\ETB\ETB.Droid\bin from the root level. There are also ZERO tracked files from within these directories that appear in the "Changes not staged for commit" section when I do a git status.

I'm really, really stumped. Can anyone help me figure out why I can't ignore these directories completely?

Update

I made the changes that the commenters suggested, and it seemed to solve some, but not all, of my problems (sorry I had it marked answered for a bit there). Relevant lines in my .gitignore at the root level are:

**/[Dd]ebug/**
**/bin/**
**/obj/**

That first line is probably not necessary, but I figured it couldn't hurt. There is definitely no extra whitespace on any of these lines.

For some reason, only one of the obj directories is still showing up in Git. I even deleted and re-added everything just to try it out.

The offending directory is the ETB.Data directory:

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        src/main/dotnet/ETB.Data/

So I ran this command:

git rm -r --cached .\src\main\dotnet\

I then committed those deletes. Then I tried to re-add the directory

git add .\src\main\dotnet

When I look at my status, here is what I'm seeing:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   src/main/dotnet/ETB.Data/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
        new file:   src/main/dotnet/ETB.Data/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
        new file:   src/main/dotnet/ETB.Data/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
        new file:   src/main/dotnet/ETB.sln
        ...
        ...

Why do these files keep showing up?! The obj and bin directories in other project directories are being ignored. Does anyone know why this one isn't being ignored?

Upvotes: 0

Views: 477

Answers (2)

Ren&#233; H&#246;hle
Ren&#233; H&#246;hle

Reputation: 27325

Thats very simple because your line in your .gitignore file are not correct. I can't test it now but try something like this for example

**/bin/**
**/obj/**

When you don't write the * at the beginning your line is interpreted as the start.

There is a good comment if you read the man page.

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

. A trailing "/" matches everything inside. For example, "abc/" matches all files inside directory "abc", relative to the location of the .gitignore file, with infinite depth.

Upvotes: 2

Marth
Marth

Reputation: 24832

You need to tell git to ignore all the bin/obj files/folders, not just the ones at its root :

**/bin/**
**/obj/**

From man gitignore :

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

  • A trailing "/**" matches everything inside. For example, "abc/**" matches all files inside directory "abc", relative to the location of the .gitignore file, with infinite depth.

Upvotes: 2

Related Questions