1

这个问题来自阅读和评论另一个问题: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 的注释。

4

1 回答 1

2

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 将忽略除 .gitignore/MyApp.xcodeproj/xcuserdata/之外的所有文件MyApp.xcscheme

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

于 2012-12-05T22:04:26.877 回答