En utilisant la fusion de sous-arbre git, tout en fusionnant également dans toutes les branches de tous les sous-arbres fusionnées

StackOverflow https://stackoverflow.com/questions/2137950

  •  22-09-2019
  •  | 
  •  

Question

Je voudrais utiliser un populaire, l'émission open source Tracker (Redmine) qui offre une intégration git. Malheureusement, chaque projet dans le suivi ne peut être associé à un git. La création de plusieurs projets dans le tracker est pas mon configuration idéale.

Dans cet esprit, je suis tenté d'utiliser la fusion sous-arbre git (expliqué ici et ici ). J'ai créé une pension « parapluie » qui a fusionné dans chacune des nombreuses autres prises en pension que je travaille.

Malheureusement, les exemples donnés ne tirez dans la branche principale de chaque sous-arbre. Depuis que je suis le développement en cours dans plusieurs branches de chaque sous-arbre, je dois apprendre à avoir cette prise en pension de parapluie reflètent chaque branche de chaque sous-arbre.

Est-ce possible?

supplémentaire Crédit: si 2 sous-arbres ont chacune une branche du même nom

Était-ce utile?

La solution

Pour ceux d'entre nous ne connaissent pas Redmine, s'il vous plaît étendre votre description pour inclure des réponses aux questions suivantes: Quel genre d'accès dans le référentiel ne le besoin de suivi? Sera-t-besoin de faire ses propres commits? Ou, at-il besoin que certains types d'accès de lecture (peut-être pour valider et engager hash scanner engager des journaux pour des mots-clés)?

Si votre suivi n'a besoin que d'un accès en lecture, vous pouvez pas besoin de fusionner sous-arbre du tout. Il est parfaitement acceptable d'avoir plusieurs commits initiales (permettant de multiples histoires indépendantes) dans un même référentiel. Le projet Git lui-même fait pour certains 'extras' ( man , html , todo ) qui partagent pas l'histoire (commit) avec, mais sont publié à côté du principal ensemble de branches pour le code source ( maint , maître , suivant , pu ). Pour votre but, il peut être suffisant pour installer une télécommande pour chaque sous-répertoire et chercher leurs conseils de branche dans votre référentiel d'agrégation. Peut-être que seraient assez « branches de suivi à distance » automatique, ou vous devez peut-être passer à l'étape supplémentaire pour créer (et mettre à jour) branches locales sur la base des branches de suivi à distance.

Le schéma de fusion sous-arbre que vous décrivez est probablement pas significatif dans la situation générale où les branches dans les dépôts de source ne sont pas liés ou seulement semi-liés. Mais, si tous les référentiels sources partagent un ensemble de branches où chaque branche a un but donné qui est la même dans tous les dépôts, vous pouvez probablement les fusionner de façon significative dans une sorte de super-dépôt.

Mais la question intéressante est pas « si deux référentiels ont des succursales avec le même nom? », Mais « comment voulez-vous gérer le cas où un dépôt manque une branche de la commune, « global » mis en? ».

Si tous les sous-répertoires ont le même ensemble de branches, vous venez de faire ce que vous avez fait avec maître , mais une fois pour chaque branche. Le problème vient quand une branche particulière est manquante à partir d'un référentiel. Vous pouvez remplacer le maître , mais cela ne peut pas toujours la bonne réponse. Cela dépend de la raison pour laquelle vous agrégeant les dépôts ensemble en premier lieu et ce que vous attendez de « voir » dans ce sous-arbre de cette branche dans le super-dépôt.

Si les sous-répertoires sont pas étroitement liés, alors j'ai vraiment mes doutes sur le caractère raisonnable de cette approche de sous-arbre. Une telle approche pour les dépôts non apparentés se sent comme il serait « va contre le grain ». Il est sans doute encore possible, mais je doute qu'il y ait un outil pour aider, et vous aurez besoin de passer un peu de temps à planifier les cas marginaux.

Si vous finissez par coller avec sous-arbre se confond, vous pouvez regarder le tiers la commande de git subtree. Il pourrait aider à garder vos dépôts myriade synchronisés.


Branches Collectionner, Sans fusion

Si Redmine spécifie clone --mirror, l'implication est qu'il attend des branches locales et peut ne pas être en mesure de lire directement les « Braches de suivi à distance », de sorte que vous aurez probablement besoin de créer et de mettre à jour certaines branches locales.

Les sections locales Mise à jour De « Branches de suivi à distance »
  • Configuration initiale

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.;s.remotes.tags/all.')"
        git config remote.$r.tagopt --no-tags
    done
    
  • Mise à jour périodique

    git remote update
    git for-each-ref --shell --format \
      'git branch --force --track -l all/%(refname:short) %(refname:short)' refs/remotes \
      | sh
    
Les sections locales qui reçoivent directement de la Direction générale Conseils Tirée par les cheveux
  • Configuration initiale

    mkdir $COLLECTION_REPO && cd $COLLECTION_REPO &&
    git init
    git remote add alpha <url/path-to-alpha-repo>
    git remote add bravo <url/path-to-bravo-repo>
    git remote add charlie <url/path-to-charlie-repo>
    for r in $(git remote); do
        git config remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.remotes.heads/all.')"
        git config --add remote.$r.fetch \
          "$(git config remote.$r.fetch | sed -e 's.heads.tags.g')"
        git config remote.$r.tagopt --no-tags
    done
    
  • Mise à jour périodique

    git remote update
    

Les deux méthodes finissent par la collecte des branches sous refs/heads/all/<remote-name>/<branch-name-on-remote>, mais le premier a aussi un double des refs sous refs/remotes/<remote-name>/<branch-name-on-remote>. La première utilise une normale d'extraction refspec et utilise git branch pour dupliquer les « branches » de suivi à distance (de refs/remotes/…) dans normales, les branches locales (refs/heads/all/…). Le second utilise un refspec personnalisépour stocker les refs récupérés directement dans la hiérarchie de ref destination.

En raison de la mise à jour sont aveuglément moyen tiré par les cheveux dans ce dépôt combiné, personne ne devrait jamais essayer de l'utiliser directement: pas commits directement sur ses branches, pas de l'extérieur pousse. Si quelqu'un devait faire commits localement ou de pousser sur l'une des branches les commits seraient anéantis lorsque la prochaine mise à jour est effectuée.

Si Redmine peut gérer un dépôt nu, je vous conseille d'utiliser un. Utilisez git init --bare et un nom de pension qui se termine par .git. Aussi git config core.logAllRefUpdates true pourrait être une bonne idée (car la valeur par défaut à false dans un dépôt nu).

Outre le préfixe all/ dans les espaces de noms, une autre différence entre cette approche et un clone complet de --mirror est que refs en dehors refs/heads et refs/tags ne seront pas collectées. La plupart des autres refs communes est considérée comme « local » à un dépôt (ce qui est la raison pour laquelle ils ne sont pas copiés par un clone normal). Certains des autres refs sont « branches de suivi à distance » (de refs/remotes), certains « bissectrice » tenue des dossiers (refs/bisect), git filter-branch sauvegardes ref « originales » (refs/original), et ainsi de suite. Probablement aucune de ces choses sont importantes pour Redmine. Si elles le sont, ils peuvent également être inclus avec refspecs supplémentaires.

Création Validations initiale supplémentaire

Pour organiser une branche avec un nouveau commit initial, consultez GitTips sous Comment créer une nouvelle branche qui n'a pas ancêtre. Deux des recettes impliquent un autre référentiel à partir duquel vous poussez ou allez chercher une branche après avoir traversé l'habituel init / ajouter / commit l'étape (exactement ce que les recettes ci-dessus font de manière automatisée).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top