如何把一个工程中的某个目录添加为git submodule
PHP中文网
PHP中文网 2017-04-21 11:16:19
0
2
801

举例:我的工程叫My,目录树如下

My
|-- My
|   |-- Support
|   |-- main.m
|   |-- images
|   |-- My-Prefix.pch
|   |-- My-Info.plist
|   |-- MyAppDelegate.h
|   |-- MyAppDelegate.m
|
|-- My.xcodeproj

我希望把项目AFNetworking加成Submodule,他的目录树如下

AFNetworking
|-- AFNetworking // 这个是真正需要的目录
|-- AFNetworking.xcworkspace
|-- Example
|-- .gitignore
|-- AFNetworking.podspec
|-- CHANGES
|-- LICENSE
|-- README.md

我要把AFNetworking加成submodule

git submodule add https://github.com/AFNetworking/AFNetworking.git My/Support/AFNetworking

最终My的目录结构

My
|-- My
|   |-- Support
|   |   |-- AFNetworking
|   |       |-- AFNetworking // 这个是真正需要的目录
|   |       |-- AFNetworking.xcworkspace
|   |       |-- Example
|   |       |-- .gitignore
|   |       |-- AFNetworking.podspec
|   |       |-- CHANGES
|   |       |-- LICENSE
|   |       |-- README.md
|   |    
|   |-- main.m
|   |-- images
|   |-- My-Prefix.pch
|   |-- My-Info.plist
|   |-- MyAppDelegate.h
|   |-- MyAppDelegate.m
|
|-- My.xcodeproj

我希望得到的目录结构是

My
|-- My
|   |-- Support
|   |   |-- AFNetworking // 这个是真正需要的目录
|   |
|   |-- main.m
|   |-- images
|   |-- My-Prefix.pch
|   |-- My-Info.plist
|   |-- MyAppDelegate.h
|   |-- MyAppDelegate.m
|
|-- My.xcodeproj

我通过在子模块目录执行这个命令,达到了效果

git filter-branch -f --subdirectory-filter AFNetworking/AFNetworking -- --all

然后

git filter-branch -f --index-filter "git rm -r -f --cached --ignore-unmatch AFNetworking/AFNetworking" --prune-empty

然后回到父仓库commit并push
看起来一切完美了,但是我重新在clone的时候
这个Submodule的状态是挂的。。。完全clone不出来,AFNetworking只是个目录,没有文件内容
我用SourceTree打开这个工程,然后看通过submodule的方式打开AFNetworking,reset一下,目录结构就回到运行 filter-branch 命令之前的样子了
也就是说,这个效果只有我一个人在运行了 filter-branch 之后看的到,有没有什么办法,可以让大家都看到呢?
另外,我还不知道这样做了以后,如果submodule有更新,能否正常。

PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(2)
伊谢尔伦

Git のサブモジュール メソッドは、実際のコンテンツをウェアハウスに追加しませんが、.gitmodules ファイルを通じて対応するサブモジュールのハッシュ値のみを保持します。

実際に使用したいコードはサブディレクトリにあるため、最初にこのサブディレクトリを別のリポジトリに抽出し (git-subtree.sh スクリプトを使用できます)、次にこのリポジトリをサブモジュールとして追加することを計画しています (またはgit-subtree.sh を直接使用して実際のコードをプロジェクトに統合すると、コードを複製する他の人がサブモジュールを更新する必要がなくなります)。この欠点は、アップストリームで更新があるたびに、それに応じてサブモジュール リポジトリを更新する必要があることです。

さらに: git-subtree.sh は git にマージされています。これは PATH にない可能性があり、直接実行できませんが、git インストール内にあるはずです。

別のアイデア:

バンドル ディレクトリを作成し、元のリポジトリをここにサブモジュールとして追加し、必要なサブディレクトリへの相対パス ソフト リンクを作成します。Git はソフト リンクを正しく処理できます。アップストリームとの同期を追加で維持する必要がないため、これはより良い方法である可能性があります。

----------

サブモジュールディレクトリで行ったのは、すでに git-subree.sh の分割操作です。 このとき、ウェアハウスは orgin とは全く異なり、サブディレクトリをルートとしてウェアハウスを再構築することに相当します。ウェアハウス オブジェクトはローカルエリアにのみ存在し、オリジンのウェアハウスには含まれないため、最終的には無効になります。 subdirectory-filter

いいねを押す +0
黄舟

ウェアハウス内のサブディレクトリをサブモジュールとして使用することは許可されていません。 git サブモジュールはウェアハウス全体のみをサポートします。

サブモジュールに依存する多くの Xcode プロジェクトはサブモジュール プロジェクトを削除しないことがわかりました。これらは静的 lib に依存しているため、コンパイル時にサブモジュール プロジェクトに従って lib.a ファイルにコンパイルされ、プロジェクトにリンクされます。サブモジュールのプロジェクト ファイルを削除すると、コンパイル時に、xcode はサブモジュールのソースを同じプロジェクトとして扱います。最初に *.m ファイルをコンパイルしてからリンクします。

上記の git-subtree.sh が解決策になる可能性があります。しかし、試したことはありません。

最後に、ココアポッドを試してみることをお勧めします。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート