2009-10-20 16 views
27

Ho questo repository git che contiene due cartelle: binary-search e poker. Ad esempio, http://github.com/soulnafein/code-katasCome rendere parte di un repository GIT esistente un sottomodulo

Vorrei creare queste cartelle in sottomoduli e mantenere la cronologia delle modifiche.

Come posso farlo?

+1

possibile duplicato di [Come estrarre una sottodirectory git e creare un sottomodulo?] (Http://stackoverflow.com/questions/920165/howto-extract-a-git-subdirectory-and-make-a- submodule-out-of-it) –

+0

possibile duplicato di [Separa sottodirectory in repository Git separato] (http: // stackoverflow.it/questions/359424/detach-subdirectory-into-separate-git-repository) –

risposta

14

L'idea generale è quella di utilizzare 'git filter-branch' e le seguenti operazioni:

1) Creare un modulo utilizzando --subdirectory-filtro filter-branch (dopo la clonazione vostro repo).

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

Vedere questo SO question per ulteriori informazioni su questo passaggio.

2) Creare un superprogetto utilizzando un filtro indice di filter-branch per eliminare il sottomodulo.

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

3) Confermare il sottomodulo all'ultima versione del superprogetto.

Vedere Detach subdirectory into separate git repository per un esempio pratico.

Ogni sottomodulo manterrà la sua cronologia.
Ma, come detto in questo patch proposal, sarebbe:

perdere tutti i collegamenti storici tra l'SuperProject ed il modulo, rompendo strumenti come 'git bisect', e rendendo difficile il recupero vecchie versioni.

Idealmente, ogni versione del SuperProject appena creato sarebbe legato alla versione corretta del modulo (e tutte le voci .gitmodules verrebbe impostato correttamente, anche, in tutta la storia del progetto)

Se non è necessario avere una cronologia precedente collegata ai nuovi sottomoduli, è possibile seguire i passaggi sopra menzionati.
Ma se hai bisogno di diramarti da un punto precedente mentre hai riferimenti ai tuoi sottomoduli (che sono al momento semplici sottodirectory), potresti prendere in considerazione di provare lo script menzionato nella patch a cui mi riferisco. Si è discusso in this thread, ma integrato a Git ancora, come dice Junio ​​C Hamano:

Purtroppo, non credo che abbiamo progettato completamente (non attuata a tutti) il comportamento di controllare diversi punti della storia che ha lo stesso sottomodulo si è spostato nell'albero del superprogetto.

14

Oggi c'è un modo migliore di fare questo: git subtree

Vedi this answer.

+0

Apparentemente, ['git subtree' è stato unito a git mainline] (https://github.com/apenwarr/git-subtree/blob/master/THIS-REPO-IS-OBSOLETE) dalla versione 1.7.11. – donut

Problemi correlati