Si scopre che la risposta è molto più semplice se si sta semplicemente cercando di incollare due repository insieme e far sembrare che fosse sempre così, piuttosto che gestire una dipendenza esterna. Devi semplicemente aggiungere telecomandi ai tuoi vecchi repository, unirli al tuo nuovo master, spostare i file e le cartelle in una sottodirectory, commettere il movimento e ripetere per tutti i repository aggiuntivi. Sottomoduli, fusioni di sottostrutture e abbellimenti fantasiosi hanno lo scopo di risolvere un problema leggermente diverso e non sono adatti a ciò che stavo cercando di fare.
Ecco uno script PowerShell esempio per incollare due repository insieme:
# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init
# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
dir > deleteme.txt
git add .
git commit -m "Initial dummy commit"
# Add a remote for and fetch the old repo
git remote add -f old_a <OldA repo URL>
# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories
# Clean up our dummy file because we don't need it any more
git rm .\deleteme.txt
git commit -m "Clean up initial file"
# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}
# Commit the move
git commit -m "Move old_a files into subdir"
# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"
Ovviamente si potrebbe invece fondersi old_b in old_a (che diventa il nuovo repo combinato) se si preferisce farlo - modificare la script per soddisfare.
Se si desidera portare over in corso caratteristica rami così, utilizzare questo:
# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress
che è l'unica parte non evidente del processo - che non è una fusione sottostruttura, ma piuttosto un argomento di la normale unione ricorsiva che dice a Git che abbiamo ribattezzato il bersaglio e che aiuta Git a riorganizzare tutto correttamente.
Ho scritto una spiegazione leggermente più dettagliata here.
fonte
2013-01-22 23:57:18
Non sto usando Git, ma in Mercurial dovrei prima fare una conversione, se necessario, per correggere i percorsi dei file dei repository da unire, e quindi forzare-tirare un repository nella destinazione per ottenere i changeset, e quindi fai unire i diversi rami. Questo è testato e funziona;) Forse questo aiuta a trovare una soluzione anche per Git ... rispetto all'approccio di sottostruttura credo che il passaggio di conversione sia diverso in cui la cronologia viene riscritta invece di mappare semplicemente un percorso (se capisco correttamente). Ciò garantisce quindi un'unione uniforme senza alcuna gestione speciale dei percorsi dei file. – Lucero
Ho trovato questa domanda anche utile http://stackoverflow.com/questions/1683531/how-to-import-existing-git-repository-into-another – nacross
Ho creato una domanda di follow-up. Potrebbe essere interessante: unire due repository Git e mantenere la cronologia master: http://stackoverflow.com/questions/42161910/merge-two-git-repositories-and-keep-the-master-history –