2009-02-20 15 views
154

Ho due progetti SVN in uso da un altro repository SVN utilizzando svn:externals.SVN: equivalente esterno in Git?

Come posso avere la stessa struttura di layout del repository in Git?

+7

Qualcuno ha una nuova risposta a questo negli ultimi 4 anni, oppure il mondo di git è lo stesso oggi? – DougW

+3

@DougW Sì, ho una [nuova risposta di seguito] (http://stackoverflow.com/a/18088319/6309): 'git submodule' ora può emulare' svn: external' (da marzo 2013). – VonC

risposta

116

Git ha due approcci simili, ma non esattamente equivalente a svn: externals:

  • sottostruttura si fonde inserire il codice del progetto esterno in un sub-directory separata all'interno del vostro repo. Questo ha un detailed process to set up e quindi è molto facile 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 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 del progetto vengono unite e i due progetti diventano effettivamente uno.

  • Git submodules (manual) Link ad un particolare commettere nel repository di un altro progetto, molto simile svn: gli esterni con un argomento -r. I sottomoduli sono facili da configurare, ma tutti gli utenti devono gestire i sottomoduli, che non sono automaticamente inclusi nelle casse (o cloni).
    Sebbene sia facile inviare le modifiche all'altro progetto, ciò potrebbe causare problemi se il repository è stato modificato. Pertanto, in genere non è opportuno inviare le modifiche a un progetto in fase di sviluppo attivo.

+16

FYI, ora è possibile specificare revisioni specifiche con svn: externals ora (dal 1.5 o 1.6 credo?) –

+5

Poiché i collegamenti nella risposta sono obsoleti, eccone alcuni nuovi: [Unisci sottostruttura @ Github: help] (http://help.github.com/subtree-merge/); [Lavorare con i sottomoduli @ Github: help] (http://help.github.com/submodules/); [Submodules @ Git user manual] (http://schacon.github.com/git/user-manual.html#submodules) – Bart

+6

FYI, i moduli git possono essere gestiti e commessi automaticamente. git crea un file .gitmodules che può/deve essere eseguito come il file .gitignore. Vedi [http://git-scm.com/book/it/Git-Tools-Submodules] per maggiori informazioni. – mikijov

6

Si dovrebbe guardare in Git submodules. Dovrebbe consentire quasi esattamente quello che stai cercando.

+0

@JonathonReinhart - Ho effettuato la modifica – Sonny

27

Come detto in "Git submodule new version update", è possibile ottenere lo stesso SVN funzione esterna con Git 1.8.2 sottomoduli:

git config -f .gitmodules submodule.<path>.branch <branch> 

Questo è sufficiente per un modulo a seguire un ramo (come nel comando LATEST di un ramo remoto di un sottomodulo upstream repo). Tutto quello che devi fare è un:

git submodule update --remote 

Questo aggiornerà il sottomodulo.

Ulteriori dettagli sono in "git submodule tracking latest".

Per convertire un modulo esistente in un monitoraggio di un ramo: vedere tutti i passaggi "Git submodules: Specify a branch/tag".

+0

Puoi eseguire il checkout parziale come con 'svn: externals'? – nowox

+0

@nowox Sì, è possibile avere un controllo sparse (git 1.7+ https://stackoverflow.com/a/2372044/6309) associato ai sottomoduli (https://stackoverflow.com/a/17693008/6309) – VonC

+0

sfortunatamente tutti le risposte relative al check-out sparse non danno mai alcun esempio :(Proverò a scrivere un esempio Gist per questo ... – nowox

1

Per l'ultima versione di Git suggerirei di leggere su Git submodules nella documentazione ufficiale di Git.