这个问题源于阅读和评论另一个问题:Xcode项目的Git忽略文件
虽然亚当的答案(以及随之而来的要点)看起来很明确,但我实际上无法让它发挥作用。我对gitignore语法的理解似乎不完整。
我的设置:OSX 10.8.2,git版本1.7.9.6(Apple git-31.1)。没有全局gitignore文件。
我正在测试一个使用Xcode4.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-reo。工作目录为项目目录:
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
被排除在之外
这一切如预期
但是,当排除规则是包含文件夹时,我无法使reincludes工作
例如,如果我的.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
结果是相同的——CCD_ 8似乎被忽略了。
类似地,如果.gitignore是
en.lproj
这些文件被排除在之外
./MyApp/en.lproj/Credits.rtf
./MyApp/en.lproj/InfoPlist.strings
./MyApp/en.lproj/MainMenu.xib
如果我想重新包括其中一个
en.lproj
!Credits.rtf
排除相同的文件:忽略CCD_ 12。
gitignore的手册页上写着:
可选前缀!这否定了该模式;任何匹配的文件被以前的模式排除的将再次被包括。如果否定的模式匹配,这将覆盖较低的优先级模式来源。
但我不确定"低优先级模式源"是什么意思,也不确定它在这里是否相关。
我错过了什么?
更新
Adam更新了他的gitignore要点,以考虑到这些问题。我已经将他的更改打包到我的fork中,还添加了一些注释,说明当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
之外的所有文件。
通常也可以忽略这些异常,只指定您实际想要忽略的内容。