DEV Community

Quang Son Le
Quang Son Le

Posted on

Git - Déplacer des dossiers d'un repo à un autre sans perdre l'historique

En deux mots, il va falloir:

  • Cloner le repo d'origine dans un dossier local temporaire
  • Isoler les fichiers à garder
  • Copier les fichiers dans le repo de destination
  • Faire un git pull

Il y a aussi quelques précautions à prendre pour éviter que des erreurs de manipulation ne mettent le chaos dans le repo d'origine.

La méthode décrite ci-dessous est un résumé/traduction/compte-rendu d'expérience de la méthode décrite par mcarans sur StackOverflow.

Préparer les fichiers

Soit A: le repo à déplacer
Et B, le repo de destination

  • Clonez le repo en local et allez dedans:

    git clone <lien vers le repo A>
    cd <dossier du repo A>

    Si vous avez déjà une copie du repo en local, je conseille de créer un dossier temporaire et d'y cloner A.

    • Pour éviter les dégâts liés aux fausses manoeuvres, coupez le lien avec origin:

    git remote rm origin

    Maintenant, si ça foire, vous êtes safe.

    • Si vous ne voulez déplacer qu'un dossier en particulier, la commande suivante permet de ne garder que le dossier voulu et son historique:

    git filter-branch --subdirectory-filter <~/dossier à garder> -- --all

    Note: Dans mon cas, cette commande livre un message d'erreur:

    fatal: <~/dossier à partager> est hors du dépôt
    Could not get the commits

    Je n'ai pas trouvé ce qui causait cette erreur, mais ça n'a pas empêché la suite du processus de se dérouler correctement.

    • L'étape précedente met tous les fichiers de votre dossier tels quels dans le dossier principal de votre repo. Vous pouvez les réorganiser avant la migration:

    mkdir <nouveau dossier>
    mv * <nouveau dossier>
    git add .
    git commit -m "<description du commit>

    Pas besoin du push vu qu'on a plus de lien avec origin.

La migration

  • Si vous ne l'avez pas en local, clonez le repo B:
    git clone <lien vers le repo B>
    cd <dossier du repo B>

  • Créez une connection remote de B vers A (où A sera une branche de B):

    git remote add branche-A <chemin/local/vers/repoA>

    L'expression branche-A peut être ce que vous voulez, c'est une désignation arbitraire que vous choisissez. Faites court, ça vous fera gagner du temps quand vous devrez le retaper.

    La solution sur StackOverflow disait de mentionner le chemin vers le sous-dossier à transférer. Lors de ma tentative, cela donnait un message d'erreur. Si vous mentionnez le dossier du repo (le dossier principal qui est créer quand vous clonez), ça marche tout aussi bien.

    • Faites un bon vieux pull:

    git pull branche-A master --allow-unrelated-histories

    IMPORTANT: il se peut que vous deviez mettre git à jour pour qu'il reconnaisse --allow-unrelated-histories. Sur Ubuntu, cela nécessite d'ajouter un repo:

    sudo add-apt-repository ppa:git-core/ppa
    sudo apt-get update
    sudo apt-get install git -y

    • Un peu de cleanup, et on push:

    git remote rm <branche-A>
    git push

    Normalement, les fichiers sont sur votre repo B avec leur historique de commit. Si jamais ça a foiré, votre copie locale et votre repo sur GitHub sont safe.

    Bon rangement!

Crédits: http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/, https://stackoverflow.com/questions/1365541/how-to-move-files-from-one-git-repo-to-another-not-a-clone-preserving-history.

Top comments (0)