GIT Imbriqués les référentiels: Compositeur vs SubModules contre la sous-Arborescence vs?

j'ai finalement intégré GitHub et Éditeur gestion des dépendances sur mon workflow. C'est certainement un grand pas en avant, bien que je reste très confus au sujet de Git Gérer les dépendances "imbriquées".

comme J'utilise une super pile WordPress ROOTS/BEDROCK, ma structure de répertoire simplifiée ressemble à ceci:

|-- /project
|   |-- /.git                    // git repository for the skeleton/stack of the project
|   |-- composer.json            // list of dependencies, most of them are my own repositories on GitHub
|   |-- /vendor
|   |   |-- /php-dependency-1    // 3rd party dependencies not directly related to Wordpress
|   |-- /web
|   |   |-- /app                 // acts as "wp-admin" folder
|   |   |   |-- /mu-plugins       
|   |   |   |   |-- /SUBREPOSITORY-1    // my own framework feature, public, GitHub
|   |   |   |   |-- /SUBREPOSITORY-2    // my own framework feature, public, GitHub
|   |   |   |-- /plugins
|   |   |   |   |-- /SUBREPOSITORY-3    // my own plugin, public, GitHub
|   |   |   |-- /themes
|   |   |   |   |-- /SUBREPOSITORY-5-PARENT-THEME    // parent theme used on my framework, public, GitHub
|   |   |   |   |-- /SUBREPOSITORY-6-CHILD-THEME     // work for client, private, BitBucket
|   |   |-- /wordpress           // Wordpress CMS
|   |   |   |-- /wp-admin
|   |   |   |-- /wp-includes

les" sous-répertoires " sont définis dans mon composer.json à la racine du projet, et peuvent être téléchargées à partir de GitHub par composer install. So far So good.

Mais! - Je m'attendre à modifier mon parent-theme et certains mu-plugins beaucoup, j'ai besoin d'être en mesure de pousser/validation de chacun de mes projets, ils seront inclus. Comme vous le savez, vous ne pouvez pas vraiment tester un thème wordpress sans une installation wordpress ...

... où aller? il y a beaucoup de billets sur ce sujet et la plupart d'entre eux mentionnent des sous-modules, mais si j'obtiens l'idée de compositeur correctement, ils sont en quelque sorte en conflit avec chaque autre.

il suffit d'utiliser imbriqué .dépôts git semble grande pour mon cas, bien qu'il ne semble pas fonctionner - si j'essaie de faire/commettre imbriquée pensions, soit "tout est à jour" ou je reçois des messages tels que Your branch is ahead by 1 commit. alors juste "emboîter" c'est non?

Merci d'avance et désolé pour le ton un peu confus de la question, je me suis noyé un peu dans le sujet. :) Toute aide serait grandement appréciée.

21
demandé sur Petr Cibulka 2014-05-08 23:19:54

1 réponses

j'ai quelques questions, et en contrepartie, la réponse ci-dessous est assez générique. Si vous répondez à mes questions, je me ferai un plaisir de les mettre à jour.

  1. le compositeur tire-t-il les mises à jour? Ou reclone le repo? (Fait-il même des mises à jour?)

    • si elle se redresse, alors l'utiliser pour des mises à jour risque d'écraser votre arbre de travail sur ces sous-repos (utilisez - le pour installer seulement ou retirez-le tout ensemble)
    • S'il ne fait pas de mises à jour ( ou de récursion de dépendances -- voir ci-dessous), alors il ajoute une complexité inutile à votre projet (supprimer et utiliser l'une des options ci-dessous)
  2. Est le compositeur en train de faire n'importe quelle gestion de dépendance (c.-à-d. se reproduisant pour trouver des dépendances imbriquées)? Ou est-ce simplement cloner les projets git comme des sous-dossiers?

    • Si c'est le cas, alors oui, les sous-modules peuvent être inadéquats pour votre cas, puisqu'il s'agit d'un système de gestion de dépendances alternatif, mais si vos sous-projets gèrent aussi leurs dépendances avec des sous-modules, alors faire un git clone --recursive devrait fonctionner pour les gérer ainsi
  3. voulez-vous que votre projet principal suive les nouveaux changements apportés à vos sous-projets?

    • Si oui: jetez un oeil à l'option n ° 2: subrepositories
    • autrement: essayer l'option #1: submodules
    • [il existe une troisième option qui fera le lien, mais je ne l'ai pas utilisé, il ne peut donc pas expliquer en détail (commentaires/éditions apprécié)]

Option #1:Submodules

Vous pouvez également gérer un individu sous-module par cd LOCAL_DIR_NAME_I et en utilisant la normale commandes git

  1. mise en place de:
git submodule add REMOTE_URI_1 LOCAL_DIR_NAME_1
...
...
git submodule add REMOTE_URI_N LOCAL_DIR_NAME_N
git commit -m "Add submodules..."
  1. Clonage (la principale projet)

    git clone MAIN_URI REPO && cd REPO && git submodule update --init --recursive

    --init copie la configuration à partir de .gitmodules .git/config avant d'effectuer la mise à jour (si nécessaire), et --recursive fera cette action récursivement dans chaque sous-modules.

    ou

    git clone --recursive MAIN_URI

    --recursive dit à git de mettre à jour et d'initialiser tous les sous-modules sur le clonage

  2. mise à Jour (la volonté de préserver des modifications non enregistrées)

    • copie Locale n'a pas de changements non poussés (met à jour tous les sous-modules par défaut):

    git submodule update [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]

    • copie Locale de l'onu a-poussé modifications (mises à jour toutes les submodules par défaut):

    git submodule update --remote --rebase [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]

  3. Publication/Poussant

ceci essaie une poussée de sous-module en premier et si réussi effectue une poussée de projet principal

git push --recurse-submodules=on-demand

Option #2: sous-répertoires

vous avez dit que vous aviez des problèmes avec cette méthode, mais je ne les comprends pas. Veuillez préciser si possible.

(git livre parle aussi de subrepos, mais je ne peux pas pour la vie de me trouver où, dès maintenant, laissez-moi savoir si vous le trouvez)

  1. mise en place de:

NOTE: le Master repo ne suivra pas les modifications apportées aux sous-repo .git, juste pour les fichiers themeselves

la barre oblique ( / ) après le nom du répertoire est essentielle pour éviter de créer un sous-module

git clone REMOTE_URI_1 LOCAL_DIR_NAME_1 && git add LOCAL_DIR_NAME_1/
...
...
git clone REMOTE_URI_N LOCAL_DIR_NAME_N && git add LOCAL_DIR_NAME_N/
git commit -m "Add subrepos..."

si vous utilisez Composer: (et il fait les clones pour vous) vous pouvez simplement faire les additions et les commit, mais peut-être Pouvez-vous configurer composer pour faire cela aussi.

gérer un sous-Prep individuel en: 'cd LOCAL_DIR_NAME_N' and use normal git les commandes

rappelez-vous que les changements à vos fichiers subrepo seront suivis par votre main repo

Le plus gros problème voici avec le clonage (si vous voulez que les colaborateurs puissent travailler sur les sous-projets) depuis votre sous-projet .les fichiers git ne sont pas suivis. Y compris un fichier, remote.info dans chaque sous-plan qui stocke la télécommande devrait résoudre ceci. Puis ajoutez un script à votre répertoire principal qui fait pour chaque sous-répertoire cd SUBDIR && git init && cat remote.info | xargs git remote add origin. Selon ce Éditeur fait (voir questions ci-dessus), vous souhaiterez peut-être ajouter un composer update commande pour ce script

Option #3: Sous-Arbre De Fusion

je ne suis pas entièrement convaincu sur les subtilités de cette méthode, donc je vais juste lien

essayez ce lien pour un petit tutoriel

Option #N: de Toute façon que vous voulez

bien sûr, vous pouvez configurer de nombreux autres flux de travail qui, dans certains cas, qui pourrait être plus simple. Par exemple, vous pourriez rester avec Éditeur pour la gestion de dep et de cloner vos sous-projets en dehors de votre projet principal, en créant des liens symboliques Non tracés dans le projet principal pour permettre un accès facile à ces fichiers lorsque vous travaillez sur le projet principal. Cela pourrait être automatisé avec un script (comme le pourrait un batch push de tous ces repos). Vous pourriez probablement même analyser compositeur.json doit le faire automatiquement pour les nouvelles dépendances (basées sur git).

Note: Il me semble que vous n'avez pas besoin d'utiliser Éditeur pas du tout. Si cette hypothèse est incorrecte, il est possible qu'aucune des 3 options ci-dessus ne résoudra vos problèmes.

28
répondu DylanYoung 2016-04-20 08:43:16