2009-10-20 5 views
27

J'ai ce dépôt git qui contient deux dossiers: binary-search et poker. Par exemple, http://github.com/soulnafein/code-katasComment faire partie d'un sous-module GIT existant

J'aimerais faire de ces dossiers des sous-modules et conserver leur historique des modifications.

Comment puis-je faire cela?

+1

duplication possible de [Comment extraire un sous-répertoire git et en faire un sous-module?] (Http://stackoverflow.com/questions/920165/howto-extract-a-git-subdirectory-and-make-a- sous-module-out-of-it) –

+0

duplication possible de [Détacher le sous-répertoire dans un référentiel Git séparé] (http: // stackoverflow.com/questions/359424/detach-sous-répertoire-dans-séparé-git-référentiel) –

Répondre

14

L'idée générale est d'utiliser "git filter-branch' et les étapes suivantes:

1) Créer un sous-module utilisant --subdirectory-filtre de filter-branch (après le clonage de votre repo).

$ git filter-branch --subdirectory-filter ABC HEAD -- --all 

Voir ce SO question pour plus d'informations sur cette étape.

2) Créez un superprojet en utilisant un filtre d'index de filter-branch pour supprimer le sous-module.

$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD 

3) Validez le sous-module avec la dernière version du superprojet.

Voir Detach subdirectory into separate git repository pour un exemple pratique.

Chaque sous-module conservera son historique.
Mais comme dit dans ce patch proposal, ce serait:

perdre tous les liens historiques entre le SuperProject et le sous-module, brisant des outils comme « git bisect », et il est difficile de récupérer les anciennes versions.

Idéalement, chaque version du SuperProject nouvellement créée serait liée à la version correcte du sous-module (et toutes les entrées de .gitmodules serait mis en place correctement, aussi, tout au long de l'histoire du projet)

Si vous n'avez pas besoin d'avoir d'historique lié aux nouveaux sous-modules, vous pouvez suivre les étapes mentionnées ci-dessus.
Mais si vous avez besoin de vous brancher à partir d'un point plus ancien tout en ayant des références à vos sous-modules (qui sont actuellement des sous-répertoires simples), vous pouvez essayer le script mentionné dans le patch auquel je me réfère. Il est discuté dans this thread, mais intégrée à Git encore, comme le dit Junio ​​C Hamano:

Malheureusement, je ne pense pas que nous avons un comportement complètement (ni mis en œuvre tout) pour vérifier différents points de l'histoire qui a le même sous-module s'est déplacé dans l'arbre du superprojet.

14

Aujourd'hui, il y a une meilleure façon de le faire: git subtree

Voir this answer.

+0

Apparemment, ['git subtree' a été fusionné dans git principal] (https://github.com/apenwarr/git-subtree/blob/master/THIS-REPO-IS-OBSOLETE) à partir de la version 1.7.11. – donut

Questions connexes