web-dev-qa-db-fra.com

Comment puis-je déplacer un seul répertoire d'un référentiel git vers un nouveau référentiel tout en conservant l'historique?

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?

109
cidered

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.

98
Brian Campbell

Pour exporter un dossier en tant que nouveau référentiel, vous devez:

  1. Pour cloner le référentiel dans lequel se trouve le dossier que vous souhaitez exporter.
  2. Pour créer un référentiel vide sur votre fournisseur d'hébergement en tant que GitHub, pour stocker le dossier exporté.
  3. Ouvrez le dossier du référentiel cloné et exécutez cette commande:

    git subtree Push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    
3
user

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?

1
Colin Burnett