gitignore否定被git for osx xcode项目忽略

gitignore否定被git for osx xcode项目忽略,xcode,macos,git,version-control,gitignore,Xcode,Macos,Git,Version Control,Gitignore,这个问题源于阅读和评论另一个问题: 虽然亚当的答案(以及随之而来的答案)似乎是确定的,但我实际上无法让它发挥作用。我对gitignore语法的理解似乎不完整 我的设置:OSX 10.8.2,git版本1.7.9.6(Apple git-31.1)。没有全局gitignore文件 我正在测试一个在Xcode 4.5中使用OSX应用程序模板创建的新项目 这是测试项目文件布局: ./.gitignore ./MyApp ./MyApp/AppDelegate.h ./MyApp/AppDelegate

这个问题源于阅读和评论另一个问题:

虽然亚当的答案(以及随之而来的答案)似乎是确定的,但我实际上无法让它发挥作用。我对gitignore语法的理解似乎不完整

我的设置:OSX 10.8.2,git版本1.7.9.6(Apple git-31.1)。没有全局gitignore文件

我正在测试一个在Xcode 4.5中使用OSX应用程序模板创建的新项目

这是测试项目文件布局:

./.gitignore
./MyApp
./MyApp/AppDelegate.h
./MyApp/AppDelegate.m
./MyApp/en.lproj
./MyApp/en.lproj/Credits.rtf
./MyApp/en.lproj/InfoPlist.strings
./MyApp/en.lproj/MainMenu.xib
./MyApp/main.m
./MyApp/MyApp-Info.plist
./MyApp/MyApp-Prefix.pch
./MyApp.xcodeproj
./MyApp.xcodeproj/project.pbxproj
./MyApp.xcodeproj/project.xcworkspace
./MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
./MyApp.xcodeproj/project.xcworkspace/xcuserdata
./MyApp.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad
./MyApp.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
./MyApp.xcodeproj/xcuserdata
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/MyApp.xcscheme
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist
我在禁用源代码管理的情况下设置测试项目,然后在终端中手动初始化git repo。工作目录是项目目录:

git init
git add .
git commit -m "first commit"
返回已提交文件的列表:

13 files changed, 5204 insertions(+)
create mode 100644 MyApp.xcodeproj/project.pbxproj
create mode 100644 MyApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata
create mode 100644 MyApp.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
create mode 100644 MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/MyApp.xcscheme
create mode 100644 MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist
create mode 100644 MyApp/AppDelegate.h
create mode 100644 MyApp/AppDelegate.m
create mode 100644 MyApp/MyApp-Info.plist
create mode 100644 MyApp/MyApp-Prefix.pch
create mode 100644 MyApp/en.lproj/Credits.rtf
create mode 100644 MyApp/en.lproj/InfoPlist.strings
create mode 100644 MyApp/en.lproj/MainMenu.xib
create mode 100644 MyApp/main.m
每次.gitignore测试后,我都会通过删除.git文件夹并重新初始化来重置

如果。这是什么

AppDelegate.h
xcuserdata  
然后
/MyApp/AppDelegate.h

被排除在外

如果我改变,我会忽略

AppDelegate*
这两项都被排除在外
/MyApp/AppDelegate.h

/MyApp/AppDelegate.m

果然

如果my.gitignore是这样的:

AppDelegate*  
!AppDelegate.m  
同样,仅排除
AppDelegate.h

这一切都是意料之中的

但是,当排除规则是包含文件夹时,我无法使reincludes工作

例如,如果my.gitignore是这样的

AppDelegate.h
xcuserdata  
然后这些文件被排除在外

/MyApp.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate

/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/MyApp.xcscheme

/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschemesmanagement.plist

现在,如果我想重新包含xcschemes的内容

xcuserdata  
!xcschemes
结果是一样的-
!xcschemes
似乎被忽略

类似地,if.gitinore是

en.lproj
这些文件被排除在外

/MyApp/en.lproj/Credits.rtf

/MyApp/en.lproj/InfoPlist.strings

/MyApp/en.lproj/main menu.xib

如果我想重新包括其中一个

en.lproj  
!Credits.rtf  
排除相同的文件:
!Credits.rtf
被忽略

gitignore的主页上只说:

可选前缀!这否定了这种模式;任何匹配的文件 被先前模式排除的将再次被包括。如果 否定模式匹配,这将覆盖较低的优先级 模式来源

但我不确定“低优先级模式源”是什么意思,或者它在这里是否相关

我错过了什么

更新

Adam已经更新了他的计划,以考虑到这些问题。我已经将他的更改打包到中,并添加了一些注释,说明如何在XCode项目已经在git控制下时添加或更改这样的.gitignore。

git遍历您的文件系统树并尝试匹配您的忽略规则。 如果规则与某个目录匹配,那么该目录将被忽略。 这意味着git甚至不会查看它的任何内容,这就是为什么它内部的任何异常都会被忽略的原因

绕过这一点有点棘手,并不总是可能的

/MyApp.xcodeproj/xcuserdata/*
!/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/
/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/*
!/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/
/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/*
!/MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/MyApp.xcscheme
上述.gitignore将忽略
/MyApp.xcodeproj/xcuserdata/
中的所有文件,但
MyApp.xcscheme
除外


通常也可以忽略这些异常,只指定实际要忽略的内容。

非路径排除(如仅
xuserdata
而不是
xuserdata/*
)不会被负面模式覆盖。关于这一点的更多信息,如果只使用一个源,即.gitignore,则模式源的优先级是不相关的。我想问题在于Git不会下降到被忽略的目录中,因此它永远不会找到包含itThanks@cebewee和Nevik的xcschemes,这一切都是有意义的,提高了我对手册页的阅读能力,并同意我的测试。另请参阅我对Michas“我当前解决方案的答案”的评论。@HeWas在跟踪此问题方面做得很好-对我的gitignore没有完全起作用表示歉意。我一开始就非常仔细地测试了它,但我猜后来的一个修改我没有测试好:(@Adam,我终于有时间用你的(未测试)更新了它)更改,谢谢。我还添加了一些关于如何使其与现有XCode项目一起工作的注释。谢谢,非常有用。我决定不否定。只是现在我必须精确地说明我排除的文件级别的内容。我发现这是一门相当黑暗的艺术。例如,我们是否要跟踪xcschememanagement.plist?我唯一需要的文件是什么可以肯定我们不想从xUserData/are UserInterfaceState.xUserState和(我想)xcdebugger。我本以为我们希望保留与xcschemes/有关的所有内容,但我无法确定这些文件中的每一个都是什么。这是我目前针对xcode的解决方案。gitignore@HeWas是的,这是主要的问题:大多数文件都是没有文档的(谢谢,苹果)——而且很多文件看起来都是不需要的,但后来证明是不需要的“必需”是因为苹果只是“偶尔”在其中插入数据(也就是说,只有当你有一个非常复杂的项目时,你才会发现问题所在)@michas-但这种行为只适用于目录,对吗?(如果是这样的话:那就不合逻辑了)。也就是说,如果我们忽略“*.something”,我们可以在后面的一行中列出“a.something””“这样行吗?