찾다

 >  Q&A  >  본문

如何把一个工程中的某个目录添加为git submodule

举例:我的工程叫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中文网2810일 전810

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:18:19

    Git의 하위 모듈 방식은 실제 콘텐츠를 웨어하우스에 추가하지 않고 .gitmodules 파일을 통해 해당 하위 모듈의 해시 값만 유지합니다.

    실제로 사용하려는 코드는 하위 디렉터리에 있으므로 내 계획은 먼저 이 하위 디렉터리를 별도의 저장소로 추출한 다음(git-subtree.sh 스크립트를 사용할 수 있음) 하위 모듈에 대해 이 저장소를 추가하는 것입니다( 또는 git-subtree.sh를 직접 사용하여 실제 코드를 프로젝트에 통합하면 이를 복제하는 다른 사람이 하위 모듈을 업데이트할 필요가 없습니다. 단점은 업스트림에 업데이트가 있을 때마다 그에 따라 하위 모듈 저장소도 업데이트되어야 한다는 것입니다.

    추가로: git-subtree.sh는 git에 병합되었습니다. PATH에 있지 않고 직접 실행할 수 없지만 git 설치에 있어야 합니다.

    또 다른 아이디어:

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

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

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

    회신하다
    0
  • 黄舟

    黄舟2017-04-21 11:18:19

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

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

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

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

    회신하다
    0
  • 취소회신하다