gitignore对osx-xcode项目的否定被git忽略



这个问题源于阅读和评论另一个问题: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之外的所有文件。

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

最新更新