Ho due progetti SVN in uso da un altro repository SVN usando svn: externals .
Come posso avere la stessa struttura del layout del repository in Git?
git submodule
ora posso emulare svn:external
(da marzo 2013).
Ho due progetti SVN in uso da un altro repository SVN usando svn: externals .
Come posso avere la stessa struttura del layout del repository in Git?
git submodule
ora posso emulare svn:external
(da marzo 2013).
Risposte:
Git ha due approcci simili, ma non esattamente equivalenti a svn: externals:
Le fusioni di sottostruttura inseriscono il codice del progetto esterno in una sottodirectory separata all'interno del repository. Questo ha un processo dettagliato da configurare e quindi è molto semplice per gli altri utenti, perché viene automaticamente incluso quando il repository viene estratto o clonato. Questo può essere un modo conveniente per includere una dipendenza nel tuo progetto.
È facile estrarre le modifiche dall'altro progetto, ma è complicato restituire le modifiche. E se l'altro progetto deve fondersi con il tuo codice, le storie dei progetti vengono unite e i due progetti diventano effettivamente uno.
Git sottomodules ( manuale ) si collega ad un particolare commit nel repository di un altro progetto, proprio come svn: externals con un-r
argomento. I sottomoduli sono facili da configurare, ma tutti gli utenti devono gestire i sottomoduli, che non sono automaticamente inclusi nei checkout (o cloni).
Sebbene sia facile inoltrare le modifiche all'altro progetto, ciò potrebbe causare problemi se il repository è cambiato. Pertanto, in genere non è appropriato inoltrare le modifiche a un progetto in fase di sviluppo attivo.
svn:externals
. Con la revisione 1.5, la sintassi è stata cambiata in un formato più flessibile. È stato aggiunto l'indirizzamento URL relativo.
Come accennato in " Aggiornamento nuova versione del sottomodulo Git ", è possibile ottenere la stessa funzionalità esterna SVN con i sottomoduli Git 1.8.2:
git config -f .gitmodules submodule.<path>.branch <branch>
Questo è sufficiente affinché un sottomodulo segua un ramo (come nel ULTIMO commit di un ramo remoto di un repository upstream del sottomodulo ). Tutto quello che devi fare è un:
git submodule update --remote
Ciò aggiornerà il sottomodulo.
Maggiori dettagli si trovano nel " git submodule
monitoraggio degli ultimi ".
Per convertire un sottomodulo esistente in uno che tiene traccia di un ramo : vedere tutti i passaggi in " Git sottomoduli: specificare un ramo / tag ".
svn:externals
?
--depth
ma non risolve davvero il problema.
Sono l'autore dello strumento gil (git links)
Ho una soluzione alternativa per lo strumento problem - gil (git links)
Permette di descrivere e gestire dipendenze di repository git complessi.
Inoltre fornisce una soluzione al problema di dipendenza dei sottomoduli ricorsivi git .
Considerare di avere le seguenti dipendenze del progetto: esempio grafico delle dipendenze del repository git
Quindi è possibile definire il .gitlinks
file con la descrizione della relazione dei repository:
# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master
# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master
# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
Ogni riga descrive git link nel seguente formato:
Finalmente devi aggiornare il tuo repository di root:
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
Di conseguenza, clonerai tutti i progetti richiesti e li collegherai correttamente.
Se si desidera eseguire il commit di tutte le modifiche in alcuni repository con tutte le modifiche nei repository collegati figlio, è possibile farlo con un singolo comando:
gil commit -a -m "Some big update"
I comandi Pull, push funzionano in modo simile:
gil pull
gil push
Lo strumento Gil (git links) supporta i seguenti comandi:
usage: gil command arguments
Supported commands:
help - show this help
context - command will show the current git link context of the current directory
clone - clone all repositories that are missed in the current context
link - link all repositories that are missed in the current context
update - clone and link in a single operation
pull - pull all repositories in the current directory
push - push all repositories in the current directory
commit - commit all repositories in the current directory
Maggiori informazioni sul problema della dipendenza dai sottomoduli ricorsivi git .
gil
.