recherche

Maison  >  Questions et réponses  >  le corps du texte

如何把一个工程中的某个目录添加为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中文网2801 Il y a quelques jours803

répondre à tous(2)je répondrai

  • 伊谢尔伦

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

    La méthode de sous-module de Git n'ajoutera pas de contenu réel à l'entrepôt, mais conservera uniquement la valeur de hachage du sous-module correspondant via le fichier .gitmodules.

    Puisque le code que vous souhaitez vraiment utiliser se trouve dans un sous-répertoire, mon plan est d'abord d'extraire ce sous-répertoire dans un référentiel séparé (vous pouvez utiliser le script git-subtree.sh), puis d'ajouter ce référentiel pour le sous-module ( ou utilisez git-subtree.sh directement pour intégrer le code réel dans votre projet, afin que les autres qui le clonent n'aient pas besoin de mettre à jour le sous-module). L'inconvénient est que chaque fois qu'il y a une mise à jour en amont, le référentiel de sous-modules doit être mis à jour en conséquence.

    De plus : git-subtree.sh a été fusionné dans git. Il n'est peut-être pas dans PATH et ne peut pas être exécuté directement, mais il devrait être dans l'installation de git.

    Autre idée :

    Créez le répertoire bundles, ajoutez le référentiel d'origine en tant que sous-module ici, puis créez un lien symbolique de chemin relatif vers le sous-répertoire requis. Git peut gérer correctement le lien symbolique. Il s'agit peut-être d'une meilleure méthode, car elle ne nécessite pas de maintenance supplémentaire de synchronisation avec l'amont.

    ----------

    Le subdirectory-filter que vous avez effectué dans le répertoire du sous-module est déjà une opération fractionnée de git-subree.sh. À ce stade, l'entrepôt est complètement différent de l'orgin, ce qui équivaut à rétablir un entrepôt avec le sous-répertoire comme. la racine. Les objets de cet entrepôt se trouvent uniquement dans votre région et ne sont pas inclus dans l'entrepôt d'origine, ils seront donc invalides à la fin.

    répondre
    0
  • 黄舟

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

    Il n'est pas autorisé d'utiliser un sous-répertoire dans un entrepôt comme sous-module. Le sous-module git ne prend en charge que l'intégralité de l'entrepôt.

    J'ai découvert que de nombreux projets Xcode qui s'appuient sur un sous-module ne supprimeront pas le projet de sous-module. Parce qu'ils s'appuient sur une bibliothèque statique, lors de la compilation, ils seront compilés dans un fichier lib.a selon le projet de sous-module, puis liés à votre projet. Si vous supprimez le fichier projet du sous-module, lors de la compilation, xcode traitera la source du sous-module comme le même projet. Compilez d'abord le fichier *.m, puis créez un lien.

    Comme mentionné ci-dessus, git-subtree.sh peut être une solution. Mais je ne l'ai pas essayé.

    Enfin, je vous propose d'essayer les cocoapodes, héhé.

    répondre
    0
  • Annulerrépondre