Skip to main content

À propos des fusions de sous-arborescences Git

Si vous devez gérer plusieurs projets au sein d’un seul dépôt, vous pouvez utiliser une fusion de sous-arborescence pour gérer toutes les références.

Platform navigation

À propos des fusions de sous-arborescences

En règle générale, une fusion de sous-arborescence est utilisée pour contenir un dépôt au sein d’un dépôt. Le « sous-dépôt » est stocké dans un dossier du dépôt principal.

La meilleure façon d’expliquer les fusions de sous-arborescences consiste à donner un exemple. Nous allons :

  • Créer un dépôt vide appelé test qui représente notre projet.
  • Fusionner un autre dépôt dans celui-ci en tant que sous-arborescence appelée Spoon-Knife.
  • Le projet test utilise ce sous-projet comme s’il faisait partie du même dépôt.
  • Extraire des mises à jour de Spoon-Knife dans notre projet test.

Configuration du dépôt vide pour une fusion de sous-arborescence

  1. Ouvrez TerminalTerminalGit Bash.

  2. Créez un répertoire et accédez-y.

    mkdir test
    cd test
    
  3. Initialisez un nouveau dépôt Git.

    $ git init
    > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
    
  4. Créez et commitez un nouveau fichier.

    $ touch .gitignore
    $ git add .gitignore
    $ git commit -m "initial commit"
    > [main (root-commit) 3146c2a] initial commit
    >  0 files changed, 0 insertions(+), 0 deletions(-)
    >  create mode 100644 .gitignore
    

Ajout d’un nouveau dépôt en tant que sous-arborescence

  1. Ajoutez une nouvelle URL distante pointant vers le projet distinct qui nous intéresse.

    $ git remote add -f spoon-knife https://github.com/octocat/Spoon-Knife.git
    > Updating spoon-knife
    > warning: no common commits
    > remote: Counting objects: 1732, done.
    > remote: Compressing objects: 100% (750/750), done.
    > remote: Total 1732 (delta 1086), reused 1558 (delta 967)
    > Receiving objects: 100% (1732/1732), 528.19 KiB | 621 KiB/s, done.
    > Resolving deltas: 100% (1086/1086), done.
    > From https://github.com/octocat/Spoon-Knife
    >  * [new branch]      main     -> Spoon-Knife/main
    
  2. Fusionnez le projet Spoon-Knife dans le projet Git local. Cela ne modifie pas vos fichiers localement, mais prépare Git à l’étape suivante.

    Si vous utilisez Git 2.9 ou version ultérieure :

    $ git merge -s ours --no-commit --allow-unrelated-histories spoon-knife/main
    > Automatic merge went well; stopped before committing as requested
    

    Si vous utilisez Git 2.8 ou version antérieure :

    $ git merge -s ours --no-commit spoon-knife/main
    > Automatic merge went well; stopped before committing as requested
    
  3. Créez un répertoire appelé spoon-knife et copiez-y l’historique Git du projet Spoon-Knife.

    $ git read-tree --prefix=spoon-knife/ -u spoon-knife/main
    > fatal: refusing to merge unrelated histories
    
  4. Commitez les modifications pour les maintenir en sécurité.

    $ git commit -m "Subtree merged in spoon-knife"
    > [main fe0ca25] Subtree merged in spoon-knife
    

Bien que nous n’ayons ajouté qu’un seul sous-projet, un nombre quelconque de sous-projets peut être incorporé dans un dépôt Git.

Conseil : Si vous créez un nouveau clone du dépôt à l’avenir, les dépôts distants que vous avez ajoutés ne seront pas créés pour vous. Vous devrez les ajouter à nouveau à l’aide de la commande git remote add.

Synchronisation avec des mises à jour et des modifications

Lorsqu’un sous-projet est ajouté, il n’est pas automatiquement synchronisé avec les modifications en amont. Vous devez mettre à jour le sous-projet avec la commande suivante :

git pull -s subtree REMOTE-NAME BRANCH-NAME

Pour l’exemple ci-dessus, il s’agit de :

git pull -s subtree spoon-knife main

Pour aller plus loin