À 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 projettest
.
Configuration du dépôt vide pour une fusion de sous-arborescence
-
Ouvrez TerminalTerminalGit Bash.
-
Créez un répertoire et accédez-y.
mkdir test cd test
-
Initialisez un nouveau dépôt Git.
$ git init > Initialized empty Git repository in /Users/octocat/tmp/test/.git/
-
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
-
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
-
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
-
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
-
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