我必须阅读至少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目录被忽略。有谁知道为什么这个不被忽视?
答案 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文件,具有无限深度。