Rumah > Soal Jawab > teks badan
举例:我的工程叫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有更新,能否正常。
伊谢尔伦2017-04-21 11:18:19
Kaedah submodul Git tidak akan menambah kandungan sebenar pada gudang, tetapi hanya akan mengekalkan nilai cincang submodul yang sepadan melalui fail .gitmodules.
Memandangkan kod yang anda benar-benar mahu gunakan adalah dalam subdirektori, rancangan saya adalah untuk mengekstrak subdirektori ini terlebih dahulu ke dalam repositori yang berasingan (anda boleh menggunakan skrip git-subtree.sh), dan kemudian menambah repositori ini untuk submodul ( atau gunakan git-subtree.sh terus untuk menyepadukan kod sebenar ke dalam projek anda, supaya orang lain yang mengklonkannya tidak perlu mengemas kini submodul). Kelemahan ini ialah apabila terdapat kemas kini di huluan, repositori submodul perlu dikemas kini dengan sewajarnya.
Selain itu: git-subtree.sh telah digabungkan menjadi git Ia mungkin tidak berada dalam PATH dan tidak boleh dilaksanakan secara langsung, tetapi ia harus berada dalam pemasangan git.
Idea lain:
Buat direktori himpunan, tambahkan repositori asal sebagai submodul di sini, dan kemudian buat laluan relatif pautan lembut ke subdirektori yang diperlukan dengan betul boleh mengendalikan pautan lembut. Ini mungkin kaedah yang lebih baik, kerana ia tidak memerlukan penyelenggaraan tambahan penyegerakan dengan huluan.
----------
subdirectory-filter
yang anda laksanakan dalam direktori submodul sudah pun merupakan operasi berpecah git-subree.sh Pada masa ini, gudang adalah berbeza sama sekali daripada orgin, yang bersamaan dengan menubuhkan semula gudang dengan subdirektori sebagai. akar. Objek dalam gudang ini hanya berada di kawasan tempatan anda dan tidak termasuk dalam gudang asal, jadi ia akan menjadi tidak sah pada akhirnya.
黄舟2017-04-21 11:18:19
Tidak dibenarkan menggunakan subdirektori dalam gudang sebagai submodul anda. submodul git hanya menyokong keseluruhan gudang.
Saya mendapati bahawa banyak projek Xcode yang bergantung pada submodul tidak akan mengalih keluar projek submodul. Kerana mereka bergantung pada lib statik, apabila menyusun, mereka akan disusun ke dalam fail lib.a mengikut projek submodul, dan kemudian dipautkan ke projek anda. Jika anda mengalih keluar fail projek submodul, maka apabila menyusun, xcode akan menganggap sumber submodul sebagai projek yang sama. Susun fail *.m dahulu, dan kemudian pautan.
Seperti yang dinyatakan di atas, git-subtree.sh mungkin merupakan penyelesaian. Tetapi saya belum mencubanya.
Akhir sekali, saya cadangkan anda mencuba cocoapods, hehe.