Créer un nouveau dépôt à partir d'un dossier en conservant l'historique

Le problème exposé dans ce sujet a été résolu.

Salut !

Je suis inscrite ici depuis plusieurs mois mais ne suit pas intervenue (soit pas le niveau, soit rien d’intéressant à dire). Je salue cependant l’initiative de ZdS, OCR ayant vraiment trop changé par rapport à SdZ ^^ Mais bref, je ne suis pas venue ici pour parler de ça.

En ce moment, je suis sur un projet de jeu qui évolue et qui se trouve dans un dossier parmi plein d’autres, le tout dans un dépôt unique sur Github. Je voudrais déplacer ce dossier dans un nouveau dépôt (sur BitBucket) tout en conservant l’historique des commits.

Par "réflexe", j’ai d’abord posté sur OCR une demande d’aide mais je me suis ensuite dit que j’aurais sans doute des réponses plus intéressantes/constructives ici. Du coup… Me voilà o/ Et voici ce que j’ai posté de l’autre côté :

Coucou tout le monde :)

Étant complètement noob avec Git mais reconnaissant tout de même la puissance de cet outil, j’ai commencé à vraiment l’utiliser il y a quelques mois. J’ai créé en même temps un dossier fourre-tout où je place plusieurs petits projets que je commit de temps en temps, histoire de garder à la fois un rythme et pouvoir revenir en arrière si le besoin s’en fait sortir.

Mais me voilà confronté à un problème qui, j’imagine, devrait être assez commun mais auquel je ne trouve pas de solution à la portée de ma connaissance sur Git… Visualisons :

1
2
3
4
5
6
7
8
<dépôt fourre-tout>
|
|-- <projet 1>
|   -- ...
|-- <projet 2>
|   -- ...
|-- <projet 3>
|   -- ...

Nous voyons donc ici le dépôt et ses 3 dossiers qui représentent chacun un petit projet. Il n’y a qu’une seule branche (la master du coup) et les commit ont parfois, parfois pas, mélangé les mises à jour entre chaque projet.

Ce que je souhaiterais est de pouvoir prendre, par exemple, le projet 2 et le mettre dans un nouveau dépôt tout en conservant l’historique des commit (si possible, filtrés pour ne contenir que les commits qui concernent le dossier du projet 2). Ce dépôt fourre-tout est pour le moment présent sur Github et je voudrais que le nouveau dépôt du projet 2 soit géré sur Bitbucket.

Tout ceci donnerait cela :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<dépôt fourre-tout> (GitHub)
|
|-- <projet 1>
|   -- ...
|-- <projet 2> (à supprimer si possible ?)
|   -- ...
|-- <projet 3>
|   -- ...

<dépôt projet 2> (BitBucket)
|
|-- ...

J’utilise Atlassian SourceTree depuis le début (qui est vachement cool quand même), donc je gère mes dépôts en GUI. J’ai cependant choppé Git Shell en même temps que le client windows de GitHub (que je n’utilise d’ailleurs plus, Sourcetree le remplaçant très bien), donc s’il faut absolument passer par des lignes de commandes…

Je n’ai pas pour habitude de demander de l’aide, mais j’ai un peu peur de corrompre mes dépôts, les commits, tout ça tout ça. Donc je préfère avoir l’avis de gens mieux informés que moi plutôt que de me planter et tout détruire.

Merci d’avance ! :)

Voilà voilà. Git m’est encore très obscur et votre aide serait vraiment la bienvenue ^^ Pas forcément des lignes pré-mâchées, si vous avez de la doc assez claire (en français ou en anglais), des conseils, … Je prends tout !

À nouveau, merci d’avance ! ;)

Tu veux git filter-branch avec --tree-filter et --prune-empty.

Par contre, lis bien la doc et ce que ça implique. En gros, ça récrit tout ton historique et tous tes commits, donc pour extraire ton nouveau projet, c'est parfait : tu crées un clones, tu git-filter-branch tout ce dont tu as besoin en jetant le reste. Mais pour ton repo d'origine je te conseille de ne pas y toucher, parce que si tu filter-branch dessus, tu auras un historique divergeant par rapport à ce qu'il y a déjà sur ton Github.

Autre problème potentiel : tu sembles être en GUI sous Windows, et git-filter-branch ça exécute des scripts shell ("bash"). Donc je ne sais pas ce que ça va donner pour toi.

Coucou !

Oui en effet, j’avais déjà créé le dépôt (et même le dossier en local !). Mais hier j’avais vraiment lu tout et n’importe quoi, ça parlait de subtree, de cherry-pick (comme tu me l’as suggéré avec ce lien), de submodules, … Bref, je m’y perdais et je ne pensais pas possible que ce soit si compliqué vu la simplicité d’utilisation de git.

Mais finalement je suis tombée sur un tuto qui correspondait exactement à mes besoins, j’en ferai une adaptation en français sur mon blog, histoire de ne jamais oublier ça ^^ En attendant, voici une version +/- formatée de ce que j’ai fait…

Juste une note, si vous pouviez relire et me dire si je n’ai pas écrit de bêtise, ce serait chouette. J’ai vérifié mes infos mais je ne suis pas exemptée d’erreur ou de mauvaise interprétation. J’ai bien sûr utilisé Git Shell vu que tout se passe en lignes de commandes.

Je me suis fortement basée sur les recommandations de ce billet : Moving A Subdirectory Into A Separate Git Repository

@rz0 : Oui effectivement, c’est +/- ce qui est expliqué dans l’article que je link ici :D


Déplacer le dossier en gardant l’historique des commits

1) Cloner l’entièreté du dépôt de base sans laisser de lien entre les deux

1
$ git clone --no-hardlinks dossier/premier/dépôt dossier/deuxième/dépôt

Le dossier qui accueillera le deuxième dépôt doit être soit vide, soit inexistant (il sera alors créé avec le clonage)

2) Changer de répertoire en cours vers le nouveau dépôt

1
$ cd /deuxième/dépôt

3) Ne garder que le dossier qui nous intéresse puis mettre son contenu à la racine du dossier

1
$ git filter-branch --subdirectory-filter monDossier HEAD -- --all

(cette ligne supprime les autres dossiers et mets notre projet à la racine)

1
$ git reset -- hard

(cette ligne déplace le HEAD sur le dernier commit concernant notre nouveau dépôt)

4) On utilise le garbage collector pour virer toutes les références inutiles de la db de git

1
$ git gc --aggressive

5) On supprime tous les objets qui ne sont plus atteignables par la db de git

1
$ git prune

Changement de dépôt

1) On supprime le dépôt de référence actuel (qui est le premier dépôt donc, on va mettre le deuxième)

1
$ git remote rm origin

2) On met maintenant l’adresse du nouveau dépôt
(GitHub)

1
$ git remote add origin https://github.com/<nom_d'utilisateur>/<nom_du_dépôt>.git

(BitBucket)

1
$ git remote add origin https://<compte>@bitbucket.org/<utilisateur>/<nom_du_dépôt>.git

(dans mon cas, c’était Lyyn@bitbucket.org/Lyyn)

3) Et pour finir, on push tous les commit filtrés sur le nouveau dépôt :

1
$ git push origin master

edit : J’ai vraiment du mal avec le markdown… :'(

edit 2: Voilà, j’ai mis en ligne cet article, en espérant ne pas avoir fait d’erreur dedans : [Git] Créer un nouveau dépôt à partir d’un dossier d’un autre dépôt

Salut Lyyn,

Je suis heureux de voir que tu as trouvé solution à ton problème, encore plus d'y avoir créer un article pour ne jamais l'oublier à l'avenir.

N'hésite pas à marquer ton sujet comme résolu (si des membres ont le même problème, ils pourront trouver une réponse à leur question). Encore mieux, si tu veux migrer ton tutoriel sur Zeste de Savoir, cela apporterait au site. :)

Ah, désolée. J’ai totalement oublié ça ^^

Migrer ce guide sur ce site ne me dérangerait pas du tout, mais j’ai choisi de faire un blog à la base pour être 100% libre aussi bien sur le contenu que sur le style d’écriture (j’aime alléger mes articles en mettant des images animées ou non). Et je ne sais pas si ça s’accorderait avec la ligne éditoriale de ZdS :/ (et ça m’ennuierait pas mal de devoir rendre mes guides moins joviaux)

Mais bref, j’vais regarder à tout ça du coup, lire les règles, voir comment formater etc. Et ça m’apportera sans doute une meilleure relecture :p

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte