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

举例:我的工程叫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 설치에 있어야 합니다.

또 다른 아이디어:

bundles 디렉터리를 생성하고 여기에 하위 모듈로 원본 저장소를 추가한 다음 필요한 하위 디렉터리에 대한 상대 경로 소프트 링크를 만듭니다. Git은 소프트 링크를 올바르게 처리할 수 있습니다. 이는 업스트림과의 동기화를 추가로 유지 관리할 필요가 없으므로 더 나은 방법일 수 있습니다.

------------

하위 모듈 디렉토리에서 수행한 subdirectory-filter은 이미 git-subree.sh의 분할 작업입니다. 이때 웨어하우스는 orgin과 완전히 다릅니다. 이는 하위 디렉토리를 다음과 같이 사용하여 웨어하우스를 다시 설정하는 것과 같습니다. 이 창고의 물건은 귀하의 지역에만 있고 원래 창고에는 포함되지 않으므로 결국 무효가 됩니다.

黄舟

창고의 하위 디렉토리를 하위 모듈로 사용할 수 없습니다. git 하위 모듈은 전체 창고만 지원합니다.

하위 모듈을 사용하는 많은 Xcode 프로젝트가 하위 모듈 프로젝트를 제거하지 않는 것으로 나타났습니다. 정적 lib에 의존하기 때문에 컴파일 시 하위 모듈 프로젝트에 따라 lib.a 파일로 컴파일된 후 프로젝트에 연결됩니다. 하위 모듈의 프로젝트 파일을 제거하면 컴파일할 때 xcode는 하위 모듈의 소스를 동일한 프로젝트로 처리합니다. *.m 파일을 먼저 컴파일한 후 링크하십시오.

위에서 언급했듯이 git-subtree.sh가 해결책이 될 수 있습니다. 하지만 나는 그것을 시도하지 않았습니다.

마지막으로 코코아팟을 드셔보시길 추천드려요 ㅎㅎ

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿