J'ai hérité d'un référentiel git contenant plusieurs projets dans des répertoires séparés. Je voudrais diviser le référentiel en nouveaux référentiels individuels, un pour chaque projet, puis demander au référentiel maître de contenir les projets en tant que sous-modules. J'aimerais faire tout cela tout en conservant si possible l'historique de révision des projets individuels.
Je pourrais cloner le référentiel pour chaque projet et supprimer tous les autres projets à chaque fois, mais y a-t-il une meilleure façon d'éviter d'avoir l'historique cloné dans chaque nouveau référentiel de projet?
Vous pouvez utiliser git filter-branch
pour réécrire l'historique d'un projet. De la documentation:
Pour réécrire le référentiel pour donner l'impression que foodir/a été la racine de son projet et supprimer toute autre histoire:
git filter-branch --subdirectory-filter foodir -- --all
Faites plusieurs copies de votre dépôt, faites-le pour chaque sous-répertoire que vous souhaitez diviser, et vous devriez vous retrouver avec ce que vous recherchez.
Pour exporter un dossier en tant que nouveau référentiel, vous devez:
Ouvrez le dossier du référentiel cloné et exécutez cette commande:
git subtree Push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
Le point de git est que l'historique est incarné dans chaque commit en hachant le commit parent. Vous pouvez "rejouer" les commits (c'est essentiellement ainsi que fonctionne l'importateur svn) dans un nouveau référentiel et ne conserver que chaque sous-projet. Cependant, cela détruirait le sens des hachages de validation. Si cela ne vous pose aucun problème, tant pis.
Dans le passé, je viens de le cloner et de continuer. Cela rend les choses plus grandes mais l'espace disque est bon marché; mon temps est cher.
Je ne connais pas non plus d'outils pour épisser un répertoire. Je suppose que vous pouvez git-log sur le répertoire pour trouver toutes les validations dessus, puis rejouer les validations avec quelque chose comme git-fast-export?