Come posso spostare una singola directory da un repository git a un nuovo repository mantenendo la cronologia?
-
03-07-2019 - |
Domanda
Ho ereditato un repository git contenente più progetti in directory separate. Vorrei dividere il repository in nuovi repository individuali, uno per ciascun progetto e quindi il repository principale deve contenere i progetti come sottomoduli. Mi piacerebbe fare tutto ciò mantenendo, se possibile, la cronologia delle revisioni dei singoli progetti.
Potrei clonare il repository per ogni progetto e rimuovere tutti gli altri progetti ogni volta, ma esiste un modo migliore per evitare di avere la cronologia clonata in ogni nuovo repository di progetti?
Soluzione
Puoi utilizzare git filter-branch
per riscrivere la storia di un progetto. Dalla documentazione:
Per riscrivere il repository in modo che assomigli a se foodir / fosse stata la radice del suo progetto, e scarta tutta la cronologia:
git filter-branch --subdirectory-filter foodir -- --all
Crea diverse copie del tuo repository, fallo per ogni sottodirectory che vuoi dividere e dovresti finire con quello che stai cercando.
Altri suggerimenti
Per esportare una cartella come nuovo repository è necessario:
- Per clonare il repository in cui si trova la cartella che si desidera esportare.
- Per creare un repository vuoto sul provider di hosting come GitHub, per archiviare la cartella esportata.
-
Apri la cartella del repository clonato ed esegui questo comando:
git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
Il punto cruciale è che la storia è incorporata in ogni commit eseguendo l'hashing del commit parent. Puoi " riprodurre " i commit (questo è essenzialmente il modo in cui funziona l'importatore svn) in un nuovo repository e mantenendo solo ciascun sottoprogetto. Ciò, tuttavia, distruggerebbe il significato degli hash di commit. Se non hai problemi con quello, allora così sia.
In passato l'ho appena clonato e sono passato. Questo rende le cose più grandi ma lo spazio su disco è economico; il mio tempo è costoso.
Inoltre non conosco alcuno strumento per separare una directory. Suppongo che potresti git-log nella directory per trovare tutti i commit su di essa, quindi riprodurre i commit con qualcosa come git-fast-export?