2010-04-01 9 views
21

Conosco migliaia di argomenti simili in circolazione. Ho letto almeno 5 thread qui in SO Ma perché non sono ancora convinto del DVCS?Vendi il controllo di revisione distribuito

Ho seguito solo le domande (si noti che sono egoisticamente solo preoccupato progetti Java)

  • Qual è il vantaggio o il valore delle commettere a livello locale? Che cosa? veramente? Tutti gli IDE moderni consentono di tenere traccia delle modifiche apportate a ? e, se richiesto, lo può ripristinare una particolare modifica. Inoltre, hanno una funzione per etichettare le tue modifiche/versioni a livello IDE !?
  • Cosa succede se si blocca il disco rigido? dove ha fatto il mio repository locale andare? (quindi, come è bello rispetto al check-in in un repository centrale?)
  • Lavoro offline o su un aereo. Qual è il problema? Per fare in modo che lo crei una versione con le mie modifiche, I deve infine connettersi al repository centrale . Fino ad allora non importa come inseguo le mie modifiche localmente.
  • Ok Linus Torvalds dà la vita a Git e odia tutto il resto. E 'abbastanza per cantare ciecamente le lodi di ? Linus vive in un diverso mondo rispetto agli sviluppatori offshore nel mio progetto di medie dimensioni?

Pitch me!

+14

Sembra che tu stia cercando una discussione piuttosto che cercare onestamente di essere convinto. Git non è per tutti, né per ogni progetto. Come hai detto ci sono migliaia di argomenti come questo, e se leggi tutto ciò che non ti convince, non usarlo. – David

+1

@David - Mi è piaciuta la tua risposta e, sì, è per questo che non ho votato per il passaggio a DVCS nella mia organizzazione. No, non sto cercando una discussione. Tutto quello che sto cercando è una risposta chiara e concisa per le mie prime 3 domande. –

+0

Joel Spolsky è un buon caso: www.hginit.com –

risposta

13

Affidabilità

Se il disco rigido comincia in silenzio danneggiare i dati, è dannatamente bene vuoi sapere su di esso. Git prende gli hash SHA1 di tutto ciò che commetti. Hai 1 repo centrale con SVN e se i suoi bit vengono modificati silenziosamente da un controller HDD difettoso, non lo saprai fino a quando non sarà troppo tardi.

E dal momento che si dispone di 1 repo centrale, appena fatto esplodere la vostra unica ancora di salvezza.

Con git, tutti gli hanno un repository identico, completo di cronologia delle modifiche, e il suo contenuto può essere completamente affidabile a causa di SHA1 della sua immagine completa. Quindi, se esegui il backup del tuo SHA1 da 20 byte del tuo HEAD, puoi essere certo che quando cloni da un mirror non affidabile, hai lo stesso repository che hai perso!

Branching (e l'inquinamento dello spazio dei nomi)

Quando si utilizza un repo centralizzato, tutti i rami ci sono per il mondo a vedere. Non puoi creare filiali private. Devi creare un ramo che non si scontri già con un altro nome globale.

"test123 -. Accidenti, c'è già un test123 Proviamo test124."

E tutti devono vedere tutti questi rami con nomi stupidi. Devi soccombere alla politica aziendale che potrebbe andare sulla falsariga di "non creare succursali a meno che non sia necessario il ", il che impedisce molte delle libertà che ottieni con git.

Lo stesso con il commit.Quando ti impegni, è meglio essere davvero sicuro che il tuo codice funzioni. Altrimenti si rompe la build. Nessun commit intermedio. Perché tutti vanno al repository centrale.

Con git non hai nulla di simile. Separa e commetti a livello locale tutto ciò che vuoi. Quando sei pronto ad esporre le tue modifiche al resto del mondo, chiedi loro di strapparti o di spingerlo ad un repo git "principale".

prestazioni

Dal momento che il repo è locale, tutte le operazioni di VCS sono veloci e non necessitano di turno viaggi e il trasferimento dal server centrale! git log non è necessario andare oltre la rete per trovare una cronologia delle modifiche. SVN sì. Lo stesso con tutti gli altri comandi, dal momento che tutte le cose importanti sono memorizzate in una posizione!

Guarda Linus' talk per questi e altri vantaggi su SVN.

+3

Nota che nelle versioni moderne del comando SVN LOG, i risultati sono memorizzati nella cache, quindi il comando non ha necessariamente bisogno di andare oltre la rete per trovare la cronologia delle modifiche. –

+0

Downvoted. La parte relativa all'affidabilità IMO è completamente errata. Se usi un sistema centralizzato (non solo il controllo del codice sorgente, ma qualsiasi sistema centralizzato) dovrebbe fare i backup e controllare il nodo centrale per la corruzione.Le corruzioni con svn sono molto rare, a proposito! Anche la parte di ramificazione è sbagliata. Puoi avere scaffali privati ​​con Subversion. – bahrep

2

L'argomento centrale sull'ID che esegue il monitoraggio per voi è falso. La maggior parte degli IDE non ha infatti alcuna funzionalità di questo tipo oltre ai livelli di annullamento illimitati. Pensa ai rami, alle fusioni, ai ripristini, ai messaggi di commit (log) e così via e scommetto che anche l'IDE a cui ti riferisci non è all'altezza. Soprattutto dubito che segua i tuoi commit - molto probabilmente su diversi rami su cui lavori - e li spinga correttamente al repository una volta che sei online.

Se il tuo IDE effettivamente fa tutto questo, in effetti lo chiamerei un sistema di controllo della versione distribuito in sé.

Infine, se il repository centrale muore per qualsiasi motivo (il fornitore di servizi è andato in bancarotta, c'è stato un incendio, un hacker lo ha danneggiato, ...), si dispone di un backup completo su ogni macchina che ha estratto il repository recentemente.

MODIFICA: È possibile utilizzare un DVCS proprio come un repository centralizzato, e lo consiglierei anche a farlo per progetti di piccole e medie dimensioni almeno. Avere un repository centrale "autorevole" che è sempre online semplifica molte cose. E quando quella macchina si blocca, è possibile passare temporaneamente a una delle altre macchine fino a quando il server non viene riparato.

+1

per l'ultimo commento sulla vulnerabilità del repository centrale: è per questo che lo si esegue, la cosa buona è che c'è solo una cosa da eseguire. –

+0

Ci sono vari motivi per cui anche i backup fallirebbero. Errore umano, un incendio, in bancarotta, a meno che tu non ti preoccupi di * frequentemente * eseguire il backup del repository su più ubicazioni fisiche e mantenere più versioni precedenti di esso. Dubito che molti si limiterebbero a tale procedura, ma semplicemente usando un DVCS questo è gratis. – Tronic

+0

I repository SVN sono diventati illeggibili semplicemente perché una versione più recente di BerkDB (il backend predefinito di SVN allora) non poteva più leggere il vecchio repository. I backup non ti aiuteranno in questo, ma un DVCS avrà copie utilizzabili su macchine che non hanno ancora aggiornato, anche se si verificasse un errore del software. – Tronic

5

DVCS è molto interessante per me in quanto:

  • aggiunge un tutto nuova dimensione al processo source control: pubblicazione.
    Non basta avere un , hai anche un flusso di lavoro di pubblicazione (a cui repository vi spingerà a/tirare da), e che possono avere molte implicazioni in termini di:

    • ciclo di sviluppo (con gli archivi fatta solo per un certo tipo di commit, come quella fatta per essere rilasciato in profuctions, per scopi di distribuzione)
    • attività solista (si può spingere e aggiornare un repo di backup, anche nel progetto form of just one file)
    • interdipendenze (quando una squadra del progetto A sta aspettando che il team porject B si impegni definitivamente al repository centrale, potrebbe ricorrere a chiedi a B di "passare" uno sviluppo intermedio come file zip allegato in una mail. Ora, tutto ciò che A deve fare è aggiungere B repo come un potenziale a distanza, prendere e dare un'occhiata)
  • porta un nuovo modo di producing/consuming revisions con:

    • un passivo modo di produrre nuove revisioni (solo quello che sono attivamente tirando dal repo li vedrà nel loro rami)
    • un modo attivo di consumare revisioni da altri (aggiungendo il loro repo come remote e recupero/fusione di ciò che ti serve da loro).

Questo significa che non dipendono da altri offrendo il loro lavoro ad un repo centrale, ma che si può avere un rapporto più diretto con i diversi attori e le loro pronti contro termine.

1

Se non visualizzi il valore della cronologia locale o delle build locali, non sono sicuro che qualsiasi risposta alla domanda cambierà la tua opinione.

Le funzionalità di cronologia degli IDE sono limitate e maldestre. Non assomigliano alla funzione completa.

Un buon esempio di come questa roba viene utilizzata è su vari progetti di Apache. Posso sincronizzare un repository git con Appo svn repo. Quindi posso lavorare per una settimana in un ramo privato tutto mio. Posso abbassare i cambiamenti dal repository. Posso riferire sui miei cambiamenti, al dettaglio o all'ingrosso. E quando ho finito, posso impacchettarli come un unico commit.

+0

@bmargulies IntelliJ IDEA fornisce un'eccellente cronologia locale e diff, date un'occhiata a 'http: // www.jetbrains.com/idea/features/local_history.html' se non avete esperienza di prima mano. –

+0

@ bearer portatore Sono perfettamente consapevole di quello che fa e non lo fa, l'ho usato. Non fa una riga di comando per mostrarmi le differenze su un intero albero, solo per dirne una. Non sincronizza le filiali remote e consente le unioni. – bmargulies

+2

Ora ci stiamo mescolando qui. Quello che ho detto è perché? perché? sulla terra ho bisogno della storia locale tramite il controllo della versione distribuita? Gestisco per cronologia locale su IDE, quindi unisco/check in/diff utilizzando il mio controllo di versione (cvs/svn ..) client (o plugin IDE) –

1

Interessante domanda.

Non sono un utente esperto di DVCS, ma la mia esposizione limitata è stata molto positiva.

Mi piace essere in grado di eseguire il commit in due passaggi. Mi sta bene.

Alcuni vantaggi che vengono in mente:

  1. Migliorato il supporto unione. Branch-Merge sembra più un cittadino di prima classe in DVCS, mentre nella mia esperienza di soluzioni centralizzate, ho trovato che è doloroso e complicato. Unisci tracciamento ora è disponibile in svn, ma è ancora lento e macchinoso.

  2. Grandi team. DVCS non è solo per commit a singolo utente. È possibile spingere i commit tra le squadre prima di contribuire al repository principale (o meno).Questo è inestimabile per certi gusti di collaborazione.

  3. quando si lavora su funzionalità sperimentali, ha senso impegnarsi frequentemente, ma solo a breve termine. Non voglio sempre escludere il codebase principale, quindi è bello poter riprodurre nuovamente &. Allo stesso modo, posso vedere che è utile quando si lavora con l'integrazione continua. Se sto lavorando per giorni sugli sforzi di refactoring, potrei interrompere i build per un periodo di tempo inaccettabile, ma voglio comunque tenere traccia delle mie modifiche.

Nota che la mia esperienza è più DVCS con Mercurial che con Git. Venendo da uno sfondo CVS/SVN, ho trovato la curva di apprendimento molto più semplice con Mercurial (Hg). Anche il supporto del codice Google aggiunto di recente a Mercurial è un vantaggio. ... mi spingo fino a dire che la mia risposta iniziale a Git è stata negativa, ma più da una prospettiva di usabilità che nulla a che fare con DVCS

1

Potrebbe essere interessante notare che Subversion sarà probabilmente avere cose come offline commits in futuro. Ovviamente non possiamo davvero confrontare queste caratteristiche con quelle disponibili oggi, ma potrebbe essere un ottimo modo per "usare DVCS in modo centralizzato" come descritto in altre risposte qui.

altro recent post afferma che Subversion non sta cercando di diventare un DVCS

Queste cose probabilmente significa che il repository è ancora centralizzato, significa che non si può fare ramificazione scollegato, diffing delle vecchie versioni, ma potete mettere in coda up commette.

14

Sono stato dove sei ora, scettico sugli usi del controllo della versione distribuita. Avevo letto tutti gli articoli e conoscevo gli argomenti teorici, ma non ne ero convinto.

Fino a quando, un giorno, ho digitato git init e improvvisamente mi sono trovato all'interno di un repository git.

Ti suggerisco di fare lo stesso - prova semplicemente. Inizia con un piccolo progetto per hobby, solo per farcela. Quindi decidere se vale la pena utilizzare per qualcosa di più grande.

-1

Molto probabilmente, nessuno ti venderà nulla qui. Se ti servono le funzionalità di git, solo git init. Se non ti va, non farlo.

Se non si conoscono ancora le funzionalità di git, digitare git vs (notare lo spazio finale) nella ricerca di Google e vedere i risultati dal completamento automatico.

Ho preferito il blocco note su IDE fino a quando non avevo bisogno delle funzionalità di Netbeans. Sembra che questo sia lo stesso caso qui.

Come sapete, ci sono stati molti progetti di successo senza VCS.

PS. Vendere git viola la sua licenza! ;)

+0

"Vendere git viola la sua licenza!", Non è vero! è GPLv2, puoi venderlo AFAIK. –

+0

* "c'erano molti progetti di successo senza VCS" * - e quanti progetti fallivano ** perché ** non stavano usando VCS (correttamente)? Guarda l'esempio del servizio CIA.vc ormai morto, che ha avuto un errore nel server di "produzione" ... e codebase era complesso e modificato in produzione (sebbene abbia repository Subversion su Google Code). –

+0

@ JakubNarębski Buon punto :) La mia risposta è un po 'cinica, è ovvio che il controllo della versione è un must. Lo strano fatto che molti sviluppatori non lo stanno ancora utilizzando anche se è gratuito e facile come 'git init' :) – takeshin

8

Sono uno sviluppatore Mercurial e ho lavorato come consulente Mercurial. Così mi trovo alle vostre domande molto interessante e spero li rispondo:

  • Qual è il vantaggio o il valore di commettere a livello locale? [...]

Lei ha ragione che IDE possono tenere traccia delle modifiche locali al di là di semplici undo/redo questi giorni. Tuttavia, c'è ancora una lacuna nella funzionalità tra queste istantanee di file e un sistema di controllo di versione completo.

I commit locali offrono la possibilità di preparare la "storia" localmente prima di inviarla per la revisione. Lavoro spesso su alcune modifiche che coinvolgono 2-5 commit. Dopo aver eseguito commit 4, potrei tornare indietro e modificare commit 2 leggermente (forse ho visto un errore in commit 2 dopo aver effettuato commit 4). In questo modo lavorerò non solo sull'ultimo codice, ma sull'ultimo paio di commit.Questo è banalmente possibile quando tutto è locale, ma diventa più complicato se devi sincronizzare con un server centrale.

  • cosa succede se mi schianto il mio disco rigido? [...] quindi, come è bello rispetto al check-in per un repo centrale?

non cool a tutti! :-)

Tuttavia, anche con un repository centrale, è ancora necessario preoccuparsi dei dati non utilizzati nella copia di lavoro. Direi quindi che dovresti avere comunque una soluzione di backup in atto.

È la mia esperienza, che le persone spesso hanno pezzi più grandi di dati non misti che giacciono nelle loro copie di lavoro con un sistema centralizzato. I clienti mi hanno detto che stavano cercando di convincere gli sviluppatori a impegnare almeno una volta alla settimana.

I cambiamenti sono spesso lasciati UNCOMMITED perché:

  1. Essi non sono davvero finiti. Ci potrebbe essere dichiarazioni di stampa di debug del codice, ci potrebbero essere incompleti funzioni, ecc

  2. Commettere sarebbe andato in trunk e che è pericoloso con un sistema centralizzato dal momento che tutti gli altri impatti.

  3. Per eseguire il commit, è necessario prima creare unione con il repository centrale. Questa unione potrebbe intimidire se si sa che sono state apportate altre modifiche in conflitto al codice. L'unione potrebbe essere semplicemente fastidiosa perché potresti non essere completamente a posto con le modifiche e preferisci lavorare da uno stato di conoscenza.

  4. Il commit può essere lento quando si deve parlare con un server centrale sovraccarico. Se ti trovi in ​​una località offshore, i commit sono ancora più lenti.

Sei assoluta corrette se si pensa che quanto sopra non è davvero una questione di rispetto centralizzato distribted controllo di versione. Con un CVCS, le persone possono lavorare in rami separati e quindi evitare banalmente 2 e 3 sopra. Con un branch separato separato, posso anche impegnarmi quanto desidero dal momento che posso creare un altro ramo in cui applico cambiamenti più chiari (risolvendo 1). I commit possono comunque essere lenti, quindi 4 può essere applicato ancora.

Le persone che utilizzano DVCS spingeranno spesso i loro commit "locali" su un server remoto come soluzione di backup di poveri. Non inviano al server principale dove sta lavorando il resto del team, ma a un altro server (possibilmente privato). In questo modo possono lavorare in isolamento e mantenere comunque backup off-site.

  • Lavoro offline o su un aereo. [...]

Sì, non mi è mai piaciuto neanche quell'argomento.Ho una buona connettività Internet il 99% delle volte e non vola abbastanza per essere un problema :-)

Tuttavia, la vera argomentazione non è che tu sia offline, ma che tu possa fingere disconnesso. Più precisamente, puoi lavorare da solo senza dover inviare immediatamente le tue modifiche ad un repository centrale.

Gli strumenti DVCS sono progettati attorno all'idea che le persone possano lavorare offline. Questo ha un certo numero di conseguenze importanti:

  • L'unione di rami diventa una cosa naturale. Quando le persone possono lavorare in parallelo, le forche si verificano naturalmente nel grafico di commit. Questi strumenti devono quindi essere veramente buoni alle filiali di fusione. Uno strumento come SVN is not very good at merging!

    Git, Mercurial e altri strumenti DVCS unire meglio perché hanno avuto più test in quest'area, non direttamente perché sono distribuiti.

  • Più flessibilità. Con un DVCS, hai la libertà di spingere/tirare le modifiche tra repository arbitrari. Spingo/sposto spesso tra i miei computer di casa e di lavoro, senza utilizzare alcun vero server centrale. Quando le cose sono pronte per la pubblicazione, li spingo in un posto come Bitbucket.

    La sincronizzazione di più siti non è più una "funzione aziendale", è una funzionalità integrata. Pertanto, se si dispone di una posizione off-shore, è possibile configurare un repository hub locale e utilizzarlo tra loro. Puoi quindi sincronizzare le ore degli hub locali, ogni giorno o quando ti si addice. Ciò richiede nient'altro che un cronjob che esegue hg pull o git fetch ad intervalli regolari.

  • Migliore scalabilità poiché più logica è sul lato client. Ciò significa meno manutenzione sul server centrale e strumenti più potenti sul lato client.

    Con un DVCS, mi aspetto di essere in grado di fare una ricerca per parole chiave attraverso le revisioni del codice(non solo il messaggio commit). Con uno strumento centralizzato, normalmente è necessario impostare uno strumento di indicizzazione supplementare.

+0

+1 per Multi-site che è incorporato . Questo può davvero essere un punto di svolta. Lavoro per un'azienda con uffici distanti 500 km l'uno dall'altro e attualmente disponiamo di un server SVN in ciascuno di essi. Alcuni script di terze parti si preoccupano di mantenerli sincronizzati. Mentre funzionano principalmente, a volte abbiamo problemi, e riallineare i 2 server non è mai banale. Mi auguro VERAMENTE che questo supporto multi-sito sia stato ufficiale e affidabile. –

1

Non ho intenzione di vendere nulla qui.

• Qual è il vantaggio o il valore dell'impegno locale? Che cosa? veramente? Tutti gli IDE moderni ti consentono di tenere traccia delle tue modifiche? e se richiesto è possibile ripristinare una particolare modifica. Inoltre, hanno una funzione per etichettare le tue modifiche/versioni a livello IDE !?

L'unico vero vantaggio è che non è necessario aver bisogno di connettività al repository centrale principale. Qualcuno può dire che il vantaggio di Git è il fatto che uno sviluppatore può commettere localmente, preparare una grande combinazione di patch e poi portarle al repository centrale benedetto, ma IMO è piuttosto poco interessante. Uno sviluppatore può utilizzare un shelve privato o un ramo nel repository Subversion per lavorare sulla sua attività e quindi unificarlo con una linea principale (ad es./Trunk) o un altro ramo.

Per me lo svantaggio principale qui è il fatto che devo scaricare e archiviare l'intero repository Git sulla mia macchina. Con un grande progetto con una storia lunga, diventa un dolore e occupa troppo spazio.

Un altro svantaggio di essere centralizzati è che Git technically can't track renames or copy operations. È solo il tries to guess whether a file was renamed or copied based on the file's content. Ciò si traduce in casi così divertenti: svn to git migration keeping history of copied file (Guy sta chiedendo perché la storia di un file è stata persa dopo SVN> Git migration,).

• Cosa succede se si blocca il disco rigido? dove è finito il mio repository locale? (Così come è freddo rispetto al check-in per un repo centrale?)

Con Git, se si è schiantato il dispositivo di memorizzazione locale (HDD, SSD, a prescindere) e aveva modifiche che non sono stati tirati o spinti al repo di un benedetto Git, allora sei sfortunato. Hai appena perso il tuo tempo e il tuo codice. Inoltre, un arresto anomalo di un disco rigido con il repository Git locale potrebbe interrompere il processo di sviluppo per qualche tempo: Linus Torvald's SSD breaks, halts Linux kernel development.

Con il controllo della sorgente centralizzato come SVN, si poteva solo perdere l'ultimo commit perché tutto il lavoro era già impegnato nel repository centrale su un ramo, un shelve privato o persino un trunk. Ovviamente, dovresti assicurarti che ci sia un disaster recovery e un backup implementato per il tuo repository centrale.

• Ok Linus Torvalds dà la vita a Git e odia tutto il resto. E 'abbastanza per cantare ciecamente le lodi? Linus vive in un diverso mondo rispetto agli sviluppatori offshore nel mio progetto di medie dimensioni?

Per un progetto come Linux Kernel che utilizzava BitKeeper in passato, Git è il miglior sistema di controllo del codice sorgente! Ma direi che Git non è adatto a tutti.

Scegli con saggezza!

Problemi correlati