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 faire en sorte que le référentiel principal contienne les projets en tant que sous-modules. J'aimerais faire tout cela tout en conservant l'historique des révisions des projets individuels si possible.
Je pourrais cloner le référentiel pour chaque projet et supprimer tous les autres projets à chaque fois, mais y a-t-il un meilleur moyen d'éviter d'avoir l'historique cloné dans chaque nouveau référentiel de projet?
git
git-submodules
cédé
la source
la source
Réponses:
Vous pouvez utiliser
git filter-branch
pour réécrire l'historique d'un projet. De la documentation: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.
la source
--subdirectory-filter
plusieurs fois. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
, etc.--subdirectory
ne prendront pas plusieurs répertoires, mais peuvent être spécifiés plusieurs fois.foodir
dans le projet d'origine, sans réécrire son historique, celagit rm -r foodir
devrait suffire (cela supprimera également la copie dans votre arbre de travail; si vous ne le souhaitez pas, utilisez--cached
). Si vous vouliez le supprimer entièrement de l'historique (en répondant également à la question de @ ilius), vous voulez quelque chose commegit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
solution est plus rapide que le--tree-filter
, car elle n'a pas à extraire réellement les fichiers, elle peut simplement manipuler l'index directement. Le--tree-filter
peut être un peu plus facile à utiliser cependant, car vous pouvez utiliser des opérations de système de fils ordinaires plutôt que d'avoir à travailler avec des opérations de manipulation d'index.Pour exporter un dossier en tant que nouveau référentiel, vous avez besoin:
Ouvrez le dossier du référentiel cloné et exécutez cette commande:
la source
git subtree
n'est pas disponible en tant que package Cygwin. Si vous en avez besoin: stackoverflow.com/a/27116828/2484903L'intérêt de git est que l'historique est incorporé dans chaque commit en hachant le commit parent. Vous pouvez "rejouer" les commits (c'est essentiellement ainsi que fonctionne svn-importer) dans un nouveau référentiel et ne conserver que chaque sous-projet. Ceci, cependant, détruirait la signification des hachages de commit. Si cela ne vous pose aucun problème, qu'il en soit ainsi.
Dans le passé, je viens de le cloner et de passer à autre chose. Cela rend les choses plus grandes mais l'espace disque est bon marché; mon temps coûte 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 tous les commits dessus, puis rejouer les commits avec quelque chose comme git-fast-export?
la source