这个问题来自阅读和评论另一个问题:Git ignore file for Xcode projects
虽然亚当的回答(以及随附的要点)似乎是确定的,但我实际上无法让它发挥作用。我对 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 文件夹并重新初始化来重置。
如果 .gitignore 是这个
AppDelegate.h
然后
./MyApp/AppDelegate.h
被排除
如果我将 .gitignore 更改为
AppDelegate*
./MyApp/AppDelegate.h
./MyApp/AppDelegate.m
正如预期的那样,这两个都被排除在外
如果我的 .gitignore 是这样的:
AppDelegate*
!AppDelegate.m
再次,仅AppDelegate.h
排除
这一切都在意料之中
但是,当排除规则是包含文件夹时,我无法重新包含工作
例如,如果我的 .gitignore 是这个
xcuserdata
然后这些文件被排除在外
./MyApp.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/MyApp.xcscheme
./MyApp.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist
现在,如果我想重新包含 xcschemes 的内容
xcuserdata
!xcschemes
结果是一样的——!xcschemes
似乎被忽略了。
同样,如果 .gitignore 是
en.lproj
这些文件被排除在外
./MyApp/en.lproj/Credits.rtf
./MyApp/en.lproj/InfoPlist.strings
./MyApp/en.lproj/MainMenu.xib
如果我想重新包含其中之一
en.lproj
!Credits.rtf
相同的文件被排除:!Credits.rtf
被忽略。
gitignore 的手册页只是这样说:
一个可选的前缀!这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。如果否定模式匹配,这将覆盖较低优先级的模式源。
但我不确定“低优先级模式来源”是什么意思,或者在这里是否相关。
我错过了什么?
更新
Adam 更新了他的gitignore gist以考虑这些问题。我已经将他的更改打包到我的 fork中,并且还添加了一些关于当 XCode 项目已经在 git 控制下时如何添加或更改此类 .gitignore 的注释。