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 rĂ©fĂ©rentiel 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 rĂ©fĂ©rentiel Ă  l’avenir, les rĂ©fĂ©rentiels 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