Auteur : Nicolas Rouanne
Date : 26 janvier 2026
Nous avons récemment migré de trois repos séparés (backoffice-ui-next, webapp, chat) vers un monorepo unique. La migration du code était assez simple—mais nous avions 13 PRs ouvertes qui devaient suivre.
Les rebaser manuellement ? Douloureux. Les recréer from scratch ? Encore pire. À la place, j'ai utilisé git format-patch et git am pour transplanter chirurgicalement les commits de chaque PR dans la nouvelle structure.
Notre monorepo mappe les anciens repos ainsi :
| Repo Source | Répertoire Cible |
|---|---|
| backoffice-ui-next | web/ |
| webapp | api/ |
| chat | chat/ |
Certaines PRs ne touchaient qu'un seul repo. D'autres—les plus complexes—traversaient plusieurs repos et devaient être combinées en une seule PR monorepo.
La magie opère en deux commandes :
# Générer un fichier patch contenant tous les commits d'une branche
git format-patch origin/develop..origin/feature-branch --stdout > /tmp/feature.patch
# Appliquer le patch avec un préfixe de répertoire
git am --directory=web/ /tmp/feature.patch
Le flag --directory est la clé. Il ajoute un chemin devant chaque fichier du patch, relocalisant ainsi les changements vers leur nouveau foyer dans le monorepo.
D'abord, j'ai ajouté tous les repositories sources comme remotes :
cd /chemin/vers/monorepo
git remote add backoffice-ui-next <https://github.com/org/backoffice-ui-next.git>
git remote add webapp <https://github.com/org/webapp.git>
git remote add chat <https://github.com/org/chat.git>
git fetch --all
Cela donne accès à toutes les branches de tous les repos—essentiel pour générer les patches.
Bien sûr, tout n'était pas parfait. Quand git am échoue, plusieurs options :