1

この質問は、別の質問を読んでコメントすることから生じます。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リポジトリを手動で初期化します。作業ディレクトリはプロジェクトディレクトリです。

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

結果は同じです-!xcschemes無視されているようです。

同様に、.gitignoreが

en.lproj

これらのファイルは除外されます

./MyApp/en.lproj/Credits.rtf
./MyApp/en.lproj/InfoPlist.strings
./MyApp/en.lproj/MainMenu.xib

それらの1つを再含めたい場合

en.lproj  
!Credits.rtf  

同じファイルが除外されます:!Credits.rtf無視されます。

gitignoreのマンページには次のように書かれています。

オプションのプレフィックス!これはパターンを否定します。以前のパターンで除外された一致するファイルは、再び含まれるようになります。否定されたパターンが一致する場合、これは優先順位の低いパターンのソースをオーバーライドします。

しかし、「優先順位の低いパターンのソース」が何を意味するのか、またはそれがここで関連するのかどうかはわかりません。

私は何が欠けていますか?

update
Adamは、これらの問題を考慮してgitignoreの要点を更新しました。私は彼の変更を私のフォークにラップし、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は、/MyApp.xcodeproj/xcuserdata/を除くのすべてのファイルを無視しますMyApp.xcscheme

多くの場合、これらの例外をほとんど無視して、実際に無視したいものだけを指定することもできます。

于 2012-12-05T22:04:26.877 に答える