Git正在跟踪目录,不会忽略它们

时间:2015-04-08 21:43:29

标签: windows git gitignore

我必须阅读至少50个StackOverflow问题和答案,说Git无法跟踪目录。然而,这正是似乎正在发生的事情。

我创建了一个项目(.NET,在Windows上),并在添加.gitignore之前添加并提交了所有文件。稍后意识到我的错误,我git rm -r --cached:/ everything,添加了这个.gitignore,并重新添加并提交了我的文件。问题是,git仍会跟踪我的obj和bin文件夹,即使它们在.gitignore中似乎被忽略了。

以下是.gitignore的相关行:

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

其中一两个可能没有意义,我并不完全熟悉.gitignore规则,而只是试图看看会有什么结果。

这是我获得的git状态:

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/

甚至在我从根级别执行git rm -r --cached。\ src \ main \ dotnet \ ETB \ ETB.Droid \ bin之后。这些目录中还存在ZERO跟踪文件,这些文件出现在&#34;更改中未进行提交&#34;我执行git状态的部分。

我真的非常难过。任何人都可以帮我弄清楚为什么我不能完全忽略这些目录?

更新

我做了评论者建议的更改,似乎解决了我的一些问题,但并非全部问题(对不起,我已经在那里标记了答案)。我的.gitignore在根级别的相关行是:

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

第一行可能没有必要,但我认为它不会受到伤害。在这些行中肯定没有额外的空格。

出于某种原因,只有一个obj目录仍然出现在Git中。我甚至删除并重新添加了所有内容,以便尝试一下。

违规目录是ETB.Data目录:

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

        src/main/dotnet/ETB.Data/

所以我运行了这个命令:

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

然后我提交了那些删除。然后我尝试重新添加目录

git add .\src\main\dotnet

当我查看我的状态时,这就是我所看到的:

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

为什么这些文件会一直显示?!其他项目目录中的obj和bin目录被忽略。有谁知道为什么这个不被忽视?

2 个答案:

答案 0 :(得分:2)

你需要告诉git忽略所有bin / obj个文件/文件夹,而不仅仅是它们的根目录:

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

来自man gitignore

  
      
  • 领先&#34; **&#34;后跟斜杠表示在所有目录中匹配。例如,&#34; ** / foo&#34;匹配文件或目录&#34; foo&#34;          任何地方,与模式相同&#34; foo&#34;。 &#34; ** /富/栏&#34;匹配文件或目录&#34; bar&#34;在任何直接的地方          目录&#34; foo&#34;。

  •   
  • 尾随&#34; / **&#34;匹配里面的一切。例如,&#34; abc / **&#34;匹配目录&#34; abc&#34;内的所有文件,相对于          .gitignore文件的位置,具有无限深度。

  •   

答案 1 :(得分:2)

这很简单,因为.gitignore文件中的行不正确。我现在无法测试它,但尝试这样的事情,例如

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

如果您没有在开头写*,则会将您的行解释为开头。

如果你阅读了手册页,那就有一个很好的评论。

  

。领先&#34; &#34;后跟斜杠表示在所有目录中匹配。   例如,&#34; / foo&#34;匹配文件或目录&#34; foo&#34;在任何地方,   与模式相同&#34; foo&#34;。 &#34; ** /富/栏&#34;匹配文件或目录&#34; bar&#34;   直接在目录下的任何地方&#34; foo&#34;。

     

。尾随&#34; / &#34;匹配里面的一切。例如,&#34; abc / &#34;   匹配目录&#34; abc&#34;内的所有文件,相对于的位置   .gitignore文件,具有无限深度。