Come posso spostare una singola directory da un repository git a un nuovo repository mantenendo la cronologia?

StackOverflow https://stackoverflow.com/questions/811251

  •  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?

È stato utile?

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:

  1. Per clonare il repository in cui si trova la cartella che si desidera esportare.
  2. Per creare un repository vuoto sul provider di hosting come GitHub, per archiviare la cartella esportata.
  3. 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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top