Git submodule vs Git clone

18

Sto lavorando a un progetto open source su GitHub.

Ha una sottodirectory / venditore in cui ha una copia di diverse librerie esterne. Il manutentore originale del progetto ha aggiornato questa directory con una copia più recente della libreria esterna una volta ogni tanto.

Uno sviluppatore mi ha inviato una richiesta di pull con l'idea di sostituire questo copia di sottomodulo git .

E sto valutando se sia una buona idea o meno.

Sottomodulo Git Pro:

  • I sottomoduli sono stati progettati appositamente per scenari simili
  • Rimuove la possibilità di commit accidentale al fornitore che verrà sovrascritto durante il prossimo aggiornamento

Sottomenu Git Contro:

  • Sembra che i sottomoduli git spingano la complessità dal manutentore a una persona che clonerà / trascinerà il progetto (ulteriori passaggi richiesti dopo aver clonato per iniziare a lavorare con il progetto: "git submodule init", "git submodule update"

Qual è la tua opinione su questo?

Un'altra cosa. Questo problema è una libreria di dimensioni ragionevolmente piccole con dipendenze esterne molto limitate. Penso che qualsiasi strumento di costruzione sarebbe eccessivo per ora.

    
posta Victor Ronin 06.03.2013 - 19:00
fonte

4 risposte

9

Un'alternativa a un sottomodulo è utilizzare git subtree . Questo offre i benefici di git submodule ma senza spingere la complessità all'utente finale. Il repository di terze parti viene fuso nell'albero del progetto principale, ma i metadati sono memorizzati in modo tale che tu possa:

  • estrai il repository di terze parti in seguito, se sono state apportate modifiche interessanti
  • Unisci nuovi aggiornamenti dal repository di terze parti (nota unione , non sovrascrivi)

Per gli utenti Git che non sono abbastanza sofisticati per comprendere i sottomoduli, l'approccio della sottostruttura rende impossibile ottenere un clone del tuo progetto più difficile di qualsiasi altro clone. Una breve descrizione della documentazione:

Subtrees allow subprojects to be included within a subdirectory of the main project, optionally including the subproject's entire history.

For example, you could include the source code for a library as a subdirectory of your application.

Subtrees are not to be confused with submodules, which are meant for the same task. Unlike submodules, subtrees do not need any special constructions (like .gitmodule files or gitlinks) be present in your repository, and do not force end-users of your repository to do anything special or to understand how subtrees work. A subtree is just a subdirectory that can be committed to, branched, and merged along with your project in any way you want.

Avevo creato un progetto al lavoro usando i sottomoduli, e il problema di tenere aggiornati i sottomoduli nei cloni di tutti era troppo lavoro. Di recente ho cambiato l'uso di sottoalberi ovunque e questi problemi sono scomparsi.

Tieni presente che la sottostruttura di git fa parte della directory git/contrib e deve essere installata separatamente .

    
risposta data 07.03.2013 - 00:31
fonte
4

Uno svantaggio dell'uso dei sottomoduli è che i tarball o gli archivi zip su Github (e molti altri servizi) non includono le fonti dei sottomoduli. Cioè, gli archivi non sono autonomi. Questo è un problema se il repository è piccolo e non ha uno script di compilazione, come un sito HTML statico che dipende da una libreria JavaScript.

    
risposta data 22.07.2014 - 11:29
fonte
3

Questo è un posto ideale per usare i sottomoduli. Riducono le dimensioni e la complessità del tuo repository e semplificano l'aggiornamento delle librerie esterne a una nuova versione.

Non sono difficili da capire come usare, e sono abbastanza comunemente usati in questa situazione, quindi prendi nota nel README del progetto che usi i sottomoduli e cosa fare, e le persone dovrebbero essere in grado di capirlo. La prima volta che ho incontrato un repository con un sottomodulo l'ho installato e funzionante in 10-15 minuti e non ho mai avuto problemi a capire da che parte fare.

    
risposta data 06.03.2013 - 20:24
fonte
3

L'uso dei sottomoduli ti impedisce di apportare modifiche locali al codice & crea una dipendenza dal repository esterno. Se sei sicuro che mai vuoi personalizzare una libreria o fare correzioni di bug locali e puoi essere sicuro che il server esterno sarà sempre disponibile quando vuoi clonare un nuova copia sono la strada da percorrere.

In breve - vuoi semplicemente usare le librerie o le consideri parte della tua base di codice? Se non sono "il tuo" codice, perché sono in controllo di versione e non solo qualcosa che devi installare?

    
risposta data 06.03.2013 - 21:27
fonte

Leggi altre domande sui tag