GIT vs. Perforce: entreranno due VCS ... uno uscirà [chiuso]


85

Quindi sono in procinto di far vendere GIT al lavoro. La prima cosa di cui ho bisogno è convincere tutti che GIT è migliore in quello che sono già abituati a fare. Attualmente utilizziamo Perforce. Qualcun altro ha effettuato una vendita simile? Qualche buon link / consiglio?

Uno dei grandi vantaggi è che possiamo lavorare con esso disconnesso dalla rete. Un'altra vittoria IMO è il modo in cui vengono gestiti gli acquisti e le aggiunte. Altri punti sono i benvenuti! Inoltre abbiamo circa 10-20 sviluppatori in totale.

Risposte:


75

Il codice sorgente dell'interprete Perl 5 è attualmente alle prese con la conversione da Perforce a git. Forse l' git-p4rawimportatore di Sam Vilain è interessante.

In ogni caso, una delle principali vittorie che avrai su ogni VCS centralizzato e su quelli più distribuiti è anche la velocità pura e vertiginosa . Non puoi immaginare quanto sia liberatorio avere a portata di mano l'intera storia del progetto, a poche frazioni di frazioni di secondo, finché non l'hai sperimentata. Anche la generazione di un registro di commit dell'intera cronologia del progetto che include una differenza completa per ogni commit può essere misurata in frazioni di secondo. Git è così veloce che il tuo cappello volerà via. I VCS che devono fare il giro della rete semplicemente non hanno alcuna possibilità di competere, nemmeno su un collegamento Gigabit Ethernet.

Inoltre, git rende molto facile essere accuratamente selettivi quando si effettuano i commit, consentendo così alle modifiche nella tua copia di lavoro (o anche all'interno di un singolo file) di essere distribuite su più commit e, se necessario, su diversi rami. Ciò ti consente di prendere meno note mentali mentre lavori: non è necessario pianificare il tuo lavoro con tanta attenzione, decidendo in anticipo quale serie di modifiche commettere e assicurandoti di rimandare qualsiasi altra cosa. Puoi semplicemente apportare le modifiche che desideri mentre ti vengono in mente e ancora districarle, quasi sempre abbastanza facilmente, quando è il momento di impegnarti. La scorta può essere di grande aiuto qui.

Ho scoperto che insieme, questi fatti mi fanno naturalmente fare molti più commit e molto più focalizzati rispetto a prima che usassi git. Questo a sua volta non solo rende la tua cronologia generalmente più utile, ma è particolarmente vantaggiosa per strumenti a valore aggiunto come git bisect.

Sono sicuro che ci sono altre cose a cui non riesco a pensare in questo momento. Un problema con la proposta di vendere la tua squadra su git è che molti vantaggi sono correlati e si giocano a vicenda, come ho accennato sopra, in modo tale che è difficile semplicemente guardare un elenco di caratteristiche e vantaggi di git e dedurre come essi cambieranno il tuo flusso di lavoro e quali modifiche saranno miglioramenti in buona fede. È necessario tenerne conto e anche segnalarlo esplicitamente.


Presumibilmente, p4sandbox fornisce alcune funzionalità offline a p4. Tuttavia mi piace ancora Git. :)
Dominic Mitchell

13
Git non fornisce "capacità offline", è offline. L'unico che invii dati via cavo è quando invii i commit all'origine o estrai le modifiche da altri sotto-repository.
Evan Plaice

2
"Git è così veloce che il tuo cappello volerà via" lo adoro :) L'unica cosa non è molto vera quando inizi a fare il check-in dei file binari. grandi repo sono problematici in git.
v.oddou

1
Purtroppo vero. Il modo in cui Git funziona dipende dalla lettura dei file e in qualche modo dalla loro differenza, quindi devono essere di dimensioni modeste e ben differenziati. Quindi sarà estremamente veloce (come nell'esempio della cronologia completa istantanea per centinaia di commit). Con enormi macchie? Non tanto ...
Aristotele Pagaltzis

84

Uso Perforce al lavoro. Uso anche Git perché vorrei ancora qualche forma di controllo della versione quando lavoro sul codice e non riesco a connettermi al server. No, riconciliare il lavoro offline non è la stessa cosa. Ecco dove ho scoperto che git è un grande vantaggio:

  1. Velocità di diramazione: git impiega al massimo alcuni secondi.
  2. Conflitti: la risoluzione automatica di P4Merge ha distrutto una settimana il lavoro di una settimana. Da allora preferirei risolvere a mano durante la fusione. Quando Git mi suggerisce un conflitto, in realtà è un conflitto. Il resto del tempo, git risolve le cose correttamente e io risparmio un sacco di tempo.
  3. Tenere traccia delle fusioni - Se hai un ramo che riceve continuamente fusioni da altri due rami, sai con forza che mal di testa può essere. Con git, il mal di testa è ridotto al minimo perché il risultato di una fusione in git è in realtà un nuovo commit che sa chi sono i suoi antenati.
  4. Autorizzazioni: ho perso traccia del numero di volte che ho provato a lavorare su un file ma non ci sono riuscito perché non è stato estratto in Perforce. Se hai lavorato con XCode (o qualsiasi editor che non dispone di un solido plug-in Perforce SCM) offline, sai quanto può essere irritante. Non devo preoccuparmene con Git. Faccio le mie modifiche. Git non mi ferma e li tiene traccia in background.
  5. Mantenere in ordine l'albero principale: con git, posso ordinare i miei commit e riordinare il codice in modo che la cronologia sia bella e ordinata. Niente di tutto questo "archiviare questo file perché avrebbe dovuto far parte del precedente check-in" spazzatura. Schiaccio gli impegni così, perché non aiutano nessuno.
  6. Stashing - Il tuo server perfce deve essere la versione 2010.1 o più recente per usare il comando shelve p4.
  7. Creazione di patch - Facile da fare in git. Non so se sia possibile in Perforce senza utilizzare la riga di comando.
  8. Invio di patch dalla GUI: di nuovo, git vince qui.
  9. Spazio su disco: per forza, ogni ramo è una copia. Ciò significa che se il tuo albero dei sorgenti è enorme, il tuo spazio su disco viene consumato velocemente. Questo non conta nemmeno lo spazio aggiuntivo una volta che inizi a costruire. Perché anche avere un collegamento tra rami e spazio su disco? Con git, puoi avere 100 rami e solo un ramo alla volta esiste. Se vuoi specificamente lavorare su due versioni contemporaneamente puoi clonare, fare il tuo lavoro e poi sbarazzarti di un clone se vuoi, senza perdere nulla.
  10. Se sei su XCode4, il supporto per perforce è stato abbandonato e il supporto per git è ora integrato. Se lavori su più piattaforme come me, questo è molto importante. Con Visual Studio puoi usare le estensioni git. Con forza, è ugualmente schifo su entrambi i sistemi operativi. Bene, forse un po 'di più su Mac ora con XCode4 sulla scena.
  11. Trovare il checkin difettoso (o, regole git bisect) - Hai mai provato a fare una ricerca binaria con forza per capire dove è stato introdotto un bug? Piuttosto una seccatura, sì? Ancora più fastidioso quando ci sono stati integratori da altri rami nel mezzo. Perché? Perché non c'è automazione per tali compiti. Devi scrivere il tuo strumento per parlare con forza e di solito non hai tempo. Con git, gli dai i punti di partenza (il punto "buono" e il punto "cattivo") e automatizza la ricerca per te. Ancora meglio, se hai uno script che può automatizzare il processo di compilazione e test, puoi collegare git allo script e l'intero processo di ricerca del check-in è automatizzato. Questo è come dovrebbe essere.
  12. Rilevamento delle modifiche tra i refactor: prova a suddividere BigClass in SmallClass1 e SmallClass2. Per Perforce, BigClass ha cessato di esistere e due nuove classi (SmallClass1 e SmallClass2 si sono unite all'albero dei sorgenti). Per Perforce, non esiste alcuna relazione tra BigClass e SmallClass1 e SmallClass2. Git, d'altra parte, è abbastanza intelligente da sapere che x% di BigClass è ora in SmallClass1 e y% di BigClass è in SmallClass2 e che BigClass ha cessato di esistere. Ora, dal punto di vista di qualcuno che sta esaminando le modifiche su più rami, dimmi quale approccio troveresti più utile: Git o Perforce. Personalmente, preferisco l'approccio di Git perché riflette in modo più accurato l'effettivo cambiamento nel codice. Git è in grado di farlo perché tiene traccia del contenuto all'interno del file e non del file stesso.
  13. Centralizzato o decentralizzato: Git è un sistema DVCS mentre per forza è centralizzato. Un VCS centralizzato non può essere decentralizzato in seguito, ma un DVCS (specialmente git) può essere centralizzato. Esistono diversi prodotti che aggiungono un controllo degli accessi molto fine a git, se è qualcosa di cui l'azienda ha bisogno. Personalmente, sceglierei un sistema che mi dia maggiore flessibilità a lungo termine.
  14. Mappature dei rami: se si desidera eseguire la ramificazione direttamente in Perforce, è necessario creare una mappatura dei rami. Ci sono ragioni per questo, ma sono legate al modo in cui Perforce concettualizza un ramo. Come sviluppatore o team, questo significa semplicemente un ulteriore passaggio nel flusso di lavoro, che non considero affatto efficiente.
  15. Condivisione del lavoro tra i team: con Perforce, non è possibile suddividere un invio. Il team A sta lavorando alla funzione A. Il team B alla funzione B. Il team C lavora alla risoluzione dei bug. Ora, i team A e B devono correggere una serie di bug per implementare le loro funzionalità. L'unica cosa è che non erano così disciplinati quando hanno eseguito il commit delle modifiche (probabilmente perché si stanno affrettando verso una scadenza) e quindi le loro "correzioni di bug" sono parti di invii più grandi che contengono anche nuove cose per quanto riguarda il controllo della versione sul loro i rami sono interessati. Tuttavia, il Team C sta ora effettuando un rilascio parziale e vorrebbe ottenere le correzioni dei bug dagli altri team. Se usassero Git, il Team C potrebbe scegliere le modifiche rilevanti degli altri team, dividerli e prendere solo ciò di cui avevano bisogno senza preoccuparsi di introdurre funzionalità parzialmente implementate. Con Perforce,
  16. Cambiare piattaforma - Se, per qualsiasi motivo in futuro, decidi di cambiare la tua piattaforma preferita, con Perforce sei in balia di Perforce.com e della disponibilità degli strumenti per la piattaforma di tua scelta.
  17. Passaggio al futuro straordinario motore di controllo del codice sorgente X: se decidi di modificare ciò che usi per il controllo del codice sorgente, estrarre la cronologia del controllo del codice sorgente da Perforce e spostarlo sul nuovo sistema X sarà un incubo, perché è closed source e il migliore si può fare è indovinare: basta Google per la migrazione da Perforce a Git per avere un'idea di cosa sto parlando. Almeno con Git, il suo open source, quindi elimina molte delle supposizioni coinvolte.

Bene, sono i miei 2 centesimi. A difesa di Perforce, devo dire le loro regole di assistenza clienti e lo stesso vale per il loro strumento Time Lapse View. Non so come ottenere una visualizzazione time lapse con git. Ma per la comodità e il tempo risparmiato, andrei con git ogni giorno.


2
re # 6 (stash): p4 shelve, è nuovo.
Trey,

Grazie. Ho aggiornato la mia risposta :)
Carl

8
La più grande differenza tra Perforce e Git è la mentalità richiesta. Se gestisci un negozio VCS centralizzato, git sarà una vendita davvero difficile, perché richiede un cambiamento nel modo in cui tu, il tuo team e l'azienda pensate al controllo della versione. In altre parole, git è uno strumento eccellente ed efficiente tecnicamente più capace di Perforce. La parte difficile è convincere gli umani :)
Carl

1
Sono innamorato di Perforce. Leggere questo post sembra come barare ...
KlausCPH

2
@KlausCPH almeno non dovrai preparare un discorso di rottura quando lascerai Perforce :)
Carl

46

Mi ci vorrebbe molto per convincermi a passare dalla forzatura. Nelle due società in cui l'ho usato era più che adeguato. Erano entrambe società con uffici disparati, ma gli uffici erano dotati di molte infrastrutture, quindi non era necessario avere le caratteristiche disgiunte / disconnesse.

Di quanti sviluppatori stai parlando di cambiare?

La vera domanda è: di cosa si tratta necessariamente che non soddisfa le esigenze della tua organizzazione che git può fornire? Allo stesso modo, quali punti deboli ha git rispetto alla forza? Se non puoi rispondere tu stesso, chiedere qui non aiuterà. Devi trovare un caso aziendale per la tua azienda. (ad esempio, forse è con un costo totale di proprietà inferiore (che include la perdita di produttività per la fase di apprendimento intermedio, costi amministrativi più elevati (almeno inizialmente), ecc.)

Penso che ti aspetta una vendita difficile - per forza è abbastanza buona da provare a sostituire. È un gioco da ragazzi se stai cercando di avviare pvcs o ssafe.


18
Aggiungerò che l'eccezionale set di funzionalità di Git ha il costo di una curva di apprendimento ripida. (Anche se non ho mai trovato Perforce così intuitivo.)
saveetheclocktower

1
Ottima risposta Tim. Justin - perché il tuo capo è stato venduto? Sicuramente devi aver risposto alla domanda di Tim per farlo? Anche a me interesserebbe la giustificazione.
Greg Whitfield,

4
Devi pagare per Perforce in un ambiente commerciale, e davvero ho sempre trovato che Perforce stridente da usare. E l'unico punto di forza che vedo davvero è che è bravo a gestire enormi blob binari.
Calyth

2
@ Justin: attenzione al motivo "useremo solo le funzionalità di base". Con git, finirai per utilizzare le cose più avanzate. Perché non dovresti? Mi viene subito in mente Bisect. Quindi fai rebase e cherry-pick.
Carl,

3
In realtà, durante una conversazione pertinente nei commenti che si è conclusa non appena è apparso il messaggio "Sei sicuro di non volerlo spostare nella chat", qualcuno ha finalmente notato che questa domanda non è adatta a SO. Si tratta essenzialmente di chiedere perché un sistema è "migliore" di un altro, e insieme ad esso invita a un bel dibattito.
Adam Parkin

15

Penso che in termini di mantenere le persone felici durante / dopo il passaggio, una delle cose da comunicare presto è quanto possa essere privata una filiale locale in Git e quanta libertà che dà loro di commettere errori. Fai in modo che tutti si clonino da soli alcuni rami privati ​​dal codice corrente e poi si scatenino, sperimentando. Rinomina alcuni file, archivia le cose, unisci le cose da un altro ramo, riavvolgi la cronologia, ridisegna una serie di modifiche sopra un'altra e così via. Mostra come anche i loro peggiori incidenti a livello locale non abbiano conseguenze per i loro colleghi. Quello che vuoi è una situazione in cui gli sviluppatori si sentano al sicuro, in modo che possano imparare più velocemente (poiché Git ha una curva di apprendimento ripida che è importante) e poi alla fine in modo che siano più efficaci come sviluppatori.

Quando stai cercando di imparare uno strumento centralizzato, ovviamente sarai preoccupato di fare qualche sciocchezza che causi problemi ad altri utenti del repository. La sola paura dell'imbarazzo è sufficiente a scoraggiare le persone dallo sperimentare. Anche avere uno speciale repository di "formazione" non aiuta, perché inevitabilmente gli sviluppatori incontreranno una situazione nel sistema di produzione che non hanno mai visto durante l'addestramento, e quindi torneranno a preoccuparsi.

Ma la natura distribuita di Git elimina tutto questo. Puoi provare qualsiasi esperimento in un ramo locale, e se va orribilmente storto, butta via il ramo e nessuno deve saperlo. Dal momento che puoi creare un ramo locale di qualsiasi cosa, puoi replicare un problema che stai riscontrando con il vero repository live, senza tuttavia correre il rischio di "rompere la build" o di prenderti in giro in altro modo. Puoi controllare assolutamente tutto, non appena lo hai fatto, senza provare a lavorare in batch in piccoli pacchetti puliti. Quindi non solo le due principali modifiche al codice su cui hai trascorso quattro ore oggi, ma anche quella correzione di build che hai ricordato a metà e l'errore di ortografia nella documentazione che hai individuato mentre spiegavi qualcosa a un collega, e così via. E se i grandi cambiamenti vengono abbandonati perché il progetto sta cambiando direzione,


Non c'è motivo per cui non puoi nemmeno avere una filiale privata di un sistema centralizzato. I DVCS a volte funzionano meglio nell'unione, ma solo perché il ramo privato non esiste nel repository remoto non significa che non puoi creare un ramo solo per te che esiste nel repository remoto.
Billy ONeal

2
Questo commento è tecnicamente corretto, ma è un po 'mancante. I sistemi di controllo delle revisioni sono uno strumento sociale. Socialmente il ramo con il tuo nome nel server condiviso non è "privato", è condiviso. Sì, anche con ACL e quant'altro in atto. Ci sono anche differenze tecniche (ovviamente il mio ramo privato git viene utilizzato mentre sono in viaggio verso casa, senza Internet / inaffidabile) ma sono sussidiarie alla differenza sociale.
tialaramex

2
Un ramo privato con forza, fa schifo. La facilità con cui crei e passi da un ramo all'altro in git, non può essere paragonata con forza. Quanto privato è in realtà un ramo necessariamente "privato" comunque. Non lo mantieni locale. Sei completamente dipendente dall'accesso alla rete.
Erik Engheim

9

Il comando che mi ha venduto personalmente su git è stato bisect . Al momento non credo che questa funzione sia disponibile in nessun altro sistema di controllo della versione.

Detto questo, se le persone sono abituate a un client GUI per il controllo del codice sorgente, non rimarranno impressionate da git. Al momento l'unico client con funzionalità complete è la riga di comando.


1
Per correttezza (ho scelto git su Hg), va notato che Mercurial ha anche la capacità di bisecare, sebbene venga fornito come plugin che devi caricare esplicitamente.
Aristotele Pagaltzis

2
darcs ha avuto "trackdown" da prima che esistesse git. Le prime versioni erano piuttosto rozze, è vero.
wnoise

2
per quanto riguarda l'interfaccia utente - GitX su OSX è eccellente.
Antony Stubbs

4
SourceTree è anche un altro bel client OSX nativo. È diventato gratuito dopo essere stato acquisito. Lo sto usando da un po 'di tempo ormai e mi piace. Ero principalmente commandliner prima di usare SourceTree.
Prakash Nadar

1
Nella mia esperienza con Git, hai davvero bisogno sia della riga di comando che di un client grafico per usarlo in modo efficace. Hai bisogno della riga di comando perché c'è molta potenza che non è facile da mettere in una GUI, e hai bisogno della GUI (o almeno git log --graph) perché le cronologie delle revisioni di Git hanno la tendenza a essere non lineari e difficili da visualizzare senza un'immagine. Uso GitX e SourceTree come GUI, sebbene gitk (che ora viene fornito con Git) sia passabile in un attimo.
Marnen Laibow-Koser

9

Quali funzionalità di Perforce utilizzano le persone?

  • Più aree di lavoro su una singola macchina
  • Elenchi di modifiche numerati
  • Filiali degli sviluppatori
  • Integrazione con IDE (Visual Studio, Eclipse, SlickEdit, ...)
  • Molte varianti di build
  • Aree di lavoro composte
  • Integrare alcune correzioni ma non altre
  • eccetera

Chiedo perché se tutto ciò che la gente sta facendo è ottenere e mettere dalla riga di comando, git lo ha coperto, e così fanno tutti gli altri RTS.


2
Non sono sicuro di cosa significhi "più spazi di lavoro su una singola macchina" - altri VCS semplicemente non hanno il concetto di uno spazio di lavoro, quindi non può essere pubblicizzato come una caratteristica di Perforce. Gli altri però hanno un senso.
Billy ONeal

Esempio di aree di lavoro multiple: il client A ha versioni di sviluppo e rilascio di file solo A più un sottoinsieme di strumenti interni alla versione 1.52; il client B ha file di sviluppo e di rilascio B più un sottoinsieme diverso ma sovrapposto di strumenti interni, sia dev che versione 1.52. Lo sviluppatore sta lavorando su entrambi contemporaneamente e può scegliere di rendere visibili ad A gli strumenti interni modificati per vedere quali interruzioni.
Thomas L Holaday

6
@Tomas: Perché non ... lo fai controllare due volte? Perforce ha bisogno di averlo come "funzionalità" perché altrimenti diventa strano a causa della necessità di assicurarsi che le variabili di ambiente siano impostate correttamente, le voci di registro corrette, eccetera.
Arafangion,

@Arafangion, non è ovvio come il doppio check-out faciliti l'esposizione selettiva dei file per creare set.
Thomas L Holaday

6

Apparentemente GitHub ora offre corsi di formazione git alle aziende . Ha detto il loro post sul blog a riguardo :

Sono stato al campus di Google diverse volte nelle ultime settimane per aiutare ad addestrare gli Androidi a Git. Mi è stato chiesto da Shawn Pearce (potresti conoscerlo dalla sua gloria in Git e EGit / JGit - è l'eroe che assume la manutenzione quando Junio ​​è fuori città) di entrare per aiutarlo a formare gli ingegneri di Google che lavorano su Andriod nella transizione da Perforce a Git , così Android potrebbe essere condiviso con le masse. Posso dirti che sono stato più che felice di farlo.

[...]

Logical Awesome offre ora ufficialmente questo tipo di servizio di formazione personalizzato a tutte le aziende, dove possiamo aiutare la tua organizzazione con la formazione e la pianificazione se stai pensando di passare anche a Git.

Enfasi mia.


4

Uso Perforce da molto tempo e recentemente ho anche iniziato a utilizzare GIT. Ecco la mia opinione "oggettiva":

Caratteristiche di Perforce:

  1. Gli strumenti della GUI sembrano essere più ricchi di funzionalità (ad es. Vista Time lapse, grafico di revisione)
  2. Velocità durante la sincronizzazione con la revisione della testina (nessun sovraccarico per il trasferimento dell'intera cronologia)
  3. Eclipse / Visual Studio Integration è davvero piacevole
  4. Puoi sviluppare più funzionalità in un ramo per Changelist (non sono ancora sicuro al 100% se questo sia un vantaggio rispetto a GIT)
  5. Puoi "spiare" cosa stanno facendo gli altri sviluppatori - che tipo di file hanno estratto.

Caratteristiche GIT:

  1. Ho avuto l'impressione che la riga di comando GIT sia molto più semplice di Perforce (init / clone, add, commit. Nessuna configurazione di aree di lavoro complesse)
  2. Velocità durante l'accesso alla cronologia del progetto dopo un checkout (ha il costo di copiare l'intera cronologia durante la sincronizzazione)
  3. Modalità offline (gli sviluppatori non si lamenteranno del fatto che un server P4 irraggiungibile impedirà loro di scrivere codice)
  4. La creazione di nuovi rami è molto più veloce
  5. Il server GIT "principale" non necessita di molti TByte di spazio di archiviazione, perché ogni sviluppatore può avere il proprio sandbox locale
  6. GIT è OpenSource, senza costi di licenza
  7. Se la tua azienda contribuisce anche a progetti OpenSource, condividere le patch è molto più semplice con GIT

In generale per i progetti OpenSource / Distributed consiglierei sempre GIT, perché è più simile a un'applicazione P2P e tutti possono partecipare allo sviluppo. Ad esempio, ricordo che quando stavo sviluppando in remoto con Perforce sincronizzavo progetti da 4 GB su un collegamento a 1 Mbps una volta alla settimana. Un sacco di tempo è stato semplicemente sprecato a causa di ciò. Inoltre avevamo bisogno di configurare una VPN per farlo.

Se hai una piccola azienda e il server P4 sarà sempre attivo, direi che anche Perforce è un'ottima opzione.


La funzione # 1 di Git è un'affermazione dubbia nella migliore delle ipotesi. Forse Git vince nella configurazione, ma l'uso quotidiano è piuttosto goffo (spesso richiede più comandi per eseguire un'attività semplice)
Adam Parkin

1
@AdamParkin Quali compiti trovi goffi dalla riga di comando? (Uso le GUI dove possibile, ma penso che la struttura dei comandi di Git sia decente.)
Marnen Laibow-Koser

1
@AdamParkin Bene, la facilità d'uso della riga di comando è un aspetto estetico, quindi è almeno soggettiva. Il motivo per cui personalmente considero la riga di comando di Git più semplice di quella di Perforce, è che in Perforce devi impostare spazi di lavoro e variabili d'ambiente (P4USER ecc.) Prima di poter persino iniziare a lavorare con i file del repository, rispetto a un singolo "git clone" comando. Ovviamente ci sono alcuni comandi git avanzati che sono assenti in Perforce (es. Riscrittura della storia locale) e potrebbero sembrare "scienza missilistica" per gli utenti regolari di Perforce.
user389238

Non l'ho usato ma mi sembra che la gestione dei set di modifiche sia solo un ramo povero, considerando che in git puoi schiacciare i tuoi rami delle funzionalità o ribasarli su master.
Ryan The Leach

4

Utilizziamo Git da un po 'di tempo, recentemente l'hard disk del nostro server Git si è bloccato e non siamo riusciti a tornare allo stato più recente. Siamo riusciti a tornare allo stato di pochi giorni. Quando è stato eseguito il backup del server. Tutti nel team hanno ritirato / inviato le modifiche e voilà, il server è tornato allo stato attuale.


3
In un discorso che Linus ha fatto a Google su Git, parla di come non esegue i backup poiché il clone di tutti del kernel Linux è un backup completo di esso. Veramente un buon punto in realtà.
Adam Parkin

Questo è vero in tutti i sensi, ogni chiusura è un "backup" ma il git in molti casi è ancora usato come uno strumento "centralizzato-distribuito". cioè proprio come SVN con ulteriori vantaggi di ramificazione. L'organizzazione vuole sempre un backup di tutto ciò che ha.
Prakash Nadar

3

L'unica differenza importante tra Perforce e git (e quella più comunemente menzionata) è la rispettiva gestione di enormi file binari.

Come, ad esempio, in questo blog di un dipendente di una società di sviluppo di videogiochi: http://corearchitecture.blogspot.com/2011/09/git-vs-perforce-from-game-development.html

Tuttavia, la cosa importante è che, la differenza di velocità tra git e perforce, quando si dispone di un enorme repository da 6 GB, contenente di tutto, dalla documentazione a tutti i file binari mai costruiti (e infine, oh sì! Il fatto che le grandi aziende tendono a gestire Perforce, e quindi l'hanno impostato per scaricare tutte le operazioni significative sull'enorme banca di server nel seminterrato.

Questo importante vantaggio da parte di Perforce deriva solo da un fattore che non ha assolutamente nulla a che fare con Perforce, il fatto che la società che lo gestisce può permettersi detta banca di server.

E comunque, alla fine, Perforce e git sono prodotti diversi. Git è stato progettato per essere esclusivamente un VCS e lo fa molto meglio di Perforce (in quanto ha più funzionalità, che sono generalmente più facili da usare, in particolare, nelle parole di un altro, ramificare in Perforce è come eseguire a cuore aperto intervento chirurgico, dovrebbe essere eseguito solo da esperti: P) ( http://stevehanov.ca/blog/index.php?id=50 )

Qualsiasi altro vantaggio ottenuto dalle aziende che utilizzano Perforce è stato ottenuto semplicemente perché Perforce non è solo un VCS, è anche un file server, oltre ad avere una serie di altre funzionalità per testare le prestazioni delle build, ecc.

Infine: essendo Git open source e molto più flessibile da avviare, non sarebbe così difficile patchare git per scaricare operazioni importanti su un server centrale, che esegue cumuli di hardware costoso.


3

Penso che l'unica cosa su cui so che GIT vince è la sua capacità di "preservare le terminazioni di riga" su tutti i file, mentre per forza sembra insistere nel tradurli in formato Unix, Dos / Windows o MacOS9 ("\ n", "\ r \ n "o" \ r).

Questo è un vero problema se stai scrivendo script Unix in un ambiente Windows o in un ambiente con sistema operativo misto. Non è nemmeno possibile impostare la regola in base all'estensione del file. Ad esempio, converte i file .sh, .bash, .unix nel formato Unix e converte i file .ccp, .bat o .com nel formato Dos / Windows.

In GIT (non sono sicuro se sia predefinito, un'opzione o l'unica opzione) puoi impostarlo per "preservare le terminazioni di riga". Ciò significa che puoi modificare manualmente le terminazioni di riga di un file, quindi GIT lascerà quel formato così com'è. Questo mi sembra il modo ideale per fare le cose, e non capisco perché questa non sia un'opzione con Perforce.

L'unico modo per ottenere questo comportamento è contrassegnare i file come binari. A quanto vedo, sarebbe un brutto trucco per aggirare una funzionalità mancante. Oltre ad essere noioso da fare su tutti gli script, ecc., Probabilmente interromperà anche la maggior parte delle differenze, ecc.

La "soluzione" che abbiamo deciso al momento, è eseguire un comando sed per rimuovere tutti i ritorni a capo dagli script ogni volta che vengono distribuiti nel loro ambiente Unix. Anche questo non è l'ideale, soprattutto perché alcuni di essi sono distribuiti all'interno di file WAR e la linea sed deve essere eseguita di nuovo quando vengono decompressi.

Questo è solo qualcosa che penso dia a GIT un grande vantaggio e che non penso sia stato menzionato sopra.

EDIT: Dopo aver utilizzato Perforce per un po 'più a lungo, vorrei aggiungere un altro paio di commenti:

A) Qualcosa che mi manca davvero in Perforce è un diff chiaro e di istanza, inclusi file modificati, rimossi e aggiunti. Questo è disponibile in GIT congit diff comando, ma in Perforce, i file devono essere estratti prima che le loro modifiche vengano registrate, e anche se i tuoi editor principali (come Eclipse) potrebbero essere impostati per ritirare automaticamente i file quando li modifichi, tu a volte potrebbe modificare i file in altri modi (blocco note, comandi unix, ecc.). E i nuovi file non sembrano affatto essere aggiunti automaticamente, anche usando Eclipse e p4eclipse, il che può essere piuttosto fastidioso. Quindi, per trovare tutte le modifiche, devi eseguire un "Diff contro ..." sull'intero spazio di lavoro, che prima di tutto richiede un po 'di tempo per essere eseguito, e in secondo luogo include tutti i tipi di cose irrilevanti a meno che tu non imposti elenchi di esclusione molto complicati, il che mi porta al punto successivo.

B) In GIT trovo il .gitignore molto semplice e facile da gestire, leggere e capire. Tuttavia, lo spazio di lavoro ignora / esclude gli elenchi configurabili in Perforce sembra ingombrante e inutilmente complesso. Non sono stato in grado di ottenere alcuna esclusione con i caratteri jolly funzionanti. Vorrei fare qualcosa di simile

-//Server/mainline/.../target/...   //Svend_Hansen_Server/.../target/...

Per escludere tutte le cartelle di destinazione all'interno di tutti i progetti all'interno di Server / mainline. Tuttavia, questo non sembra funzionare come mi sarei aspettato e ho finito per aggiungere una riga per ogni progetto come:

-//Server/mainline/projectA/target/...  //Svend_Hansen_Server/projectA/target/...
-//Server/mainline/projectB/target/...  //Svend_Hansen_Server/projectB/target/...
...

E righe simili per cartelle bin, file .classpath e .projet e altro ancora.

C) In Perforce ci sono gli elenchi delle modifiche piuttosto utili. Tuttavia, supponiamo che io effettui un gruppo di modifiche, le controlli tutte e le inserisca in una lista delle modifiche, per poi lavorare su qualcos'altro prima di inviare quella lista delle modifiche. Se in seguito apporto una modifica a uno dei file inclusi nella prima lista modifiche, quel file sarà ancora in quella lista modifiche, e non posso semplicemente inviare la lista modifiche in seguito presumendo che contenga solo le modifiche che ho aggiunto originariamente (sebbene saranno gli stessi file). In GIT, se aggiungi un file e vengono apportate ulteriori modifiche, tali modifiche non saranno state aggiunte (e verrebbero comunque visualizzate in ungit diffe non saresti in grado di eseguire il commit del file senza prima aggiungere anche le nuove modifiche. Ovviamente, questo non è utile nello stesso modo in cui può essere l'elenco delle modifiche poiché hai solo un set di file aggiunti, ma in GIT puoi semplicemente eseguire il commit delle modifiche, poiché in realtà non le spinge. Potresti lavorare su altre modifiche prima di spingerle, ma non saresti in grado di spingere nient'altro che aggiungi in seguito, senza spingere anche le modifiche precedenti.


2

Non ho esperienza con Git, ma ho con Mercurial che è anche un VCS distribuito. Dipende davvero dal progetto, ma nel nostro caso un VCS distribuito si adattava al progetto poiché sostanzialmente eliminava le build interrotte frequenti.

Penso che dipenda davvero dal progetto, in quanto alcuni sono più adatti a un VCS client-server e altri a uno distribuito.


(Certo, questa è una vecchia risposta, ma ...) Puoi eseguire Git (e presumo anche Mercurial) come se fosse un VCS client-server. Funziona ancora meglio dei VCS client-server, grazie alla facilità di ramificazione e unione e alla possibilità di commit privati. Non vedo più molto uso per i VCS client-server, almeno fino a quando non raggiungono le loro capacità di unione alla pari.
Marnen Laibow-Koser

-5

Ecco cosa non mi piace di git:

Prima di tutto, penso che l'idea distribuita vada contro la realtà. Chiunque stia effettivamente usando git lo fa in modo centralizzato, anche Linus Torvalds. Se il kernel fosse gestito in modo distribuito, ciò significherebbe che non potrei effettivamente scaricare i sorgenti "ufficiali" del kernel - non ce ne sarebbero uno - dovrei decidere se voglio la versione di Linus, o quella di Joe, o la versione di Bill. Sarebbe ovviamente ridicolo, ed è per questo che esiste una definizione ufficiale che Linus controlla utilizzando un flusso di lavoro centralizzato.

Se accetti di volere una definizione centralizzata delle tue cose, diventa chiaro che i ruoli del server e del client sono completamente diversi, quindi il dogma secondo cui i software client e server dovrebbero essere gli stessi diventa puramente limitante. Il dogma che i dati del client e del server dovrebbero essere gli stessi diventa palesemente ridicolo, specialmente in una base di codice che ha quindici anni di storia di cui nessuno si preoccupa ma che tutti dovrebbero clonare.

Quello che vogliamo davvero fare con tutte quelle vecchie cose è metterle in un armadio e dimenticare che sono lì, proprio come fa qualsiasi normale VCS. Il fatto che git trascini tutto avanti e indietro sulla rete ogni giorno è molto pericoloso, perché ti tormenta a potarlo. Quella potatura comporta molte decisioni noiose e può andare storta. Quindi le persone probabilmente manterranno un'intera serie di repo di istantanee da vari punti della storia, ma non era questo ciò a cui serviva il controllo del codice sorgente? Questo problema non esisteva fino a quando qualcuno non ha inventato il modello distribuito.

Git incoraggia attivamente le persone a riscrivere la storia, e quanto sopra è probabilmente una delle ragioni per questo. Ogni normale VCS rende la riscrittura della cronologia impossibile per tutti tranne che per gli amministratori e si assicura che gli amministratori non abbiano motivo di prenderla in considerazione. Correggimi se sbaglio, ma per quanto ne so, git non fornisce alcun modo per concedere agli utenti normali l'accesso in scrittura ma proibisce loro di riscrivere la cronologia. Ciò significa che qualsiasi sviluppatore con rancore (o che stava ancora lottando con la curva di apprendimento) potrebbe distruggere l'intera base di codice. Come lo stringiamo? Bene, o fai backup regolari dell'intera cronologia, cioè mantieni la cronologia al quadrato, o proibisci l'accesso in scrittura a tutti tranne che a qualche poveraccio che riceverebbe tutte le differenze via e-mail e le unirebbe a mano.

Facciamo un esempio di un grande progetto ben finanziato e vediamo come git sta funzionando per loro: Android. Una volta ho deciso di giocare con il sistema Android stesso. Ho scoperto che avrei dovuto usare un gruppo di script chiamati repo per ottenere il loro git. Alcuni repo vengono eseguiti sul client e altri sul server, ma entrambi, per la loro stessa esistenza, stanno illustrando il fatto che git è incompleto in entrambe le capacità. Quello che è successo è che non sono stato in grado di estrarre le fonti per circa una settimana e poi ho rinunciato del tutto. Avrei dovuto estrarre una quantità davvero enorme di dati da diversi repository diversi, ma il server era completamente sovraccarico di persone come me. Il repository era scaduto e non è stato possibile riprenderlo dal punto in cui era scaduto. Se git è così distribuibile, avresti pensato che ' Ho fatto una sorta di operazione peer-to-peer per alleviare il carico su quell'unico server. Git è distribuibile, ma non è un server. Git + repo è un server, ma il repo non è distribuibile perché è solo una raccolta ad-hoc di hack.

Un esempio simile dell'inadeguatezza di git è gitolite (e il suo antenato che apparentemente non ha funzionato così bene). Gitolite descrive il suo lavoro come facilitare la distribuzione di un server git. Di nuovo, l'esistenza stessa di questa cosa prova che git non è un server, non più di quanto non sia un client. Inoltre, non lo sarà mai, perché se diventasse uno dei due tradirebbe i suoi principi fondanti.

Anche se credessi nella cosa distribuita, git sarebbe comunque un disastro. Che cos'è, ad esempio, una filiale? Dicono che tu crei implicitamente un ramo ogni volta che cloni un repository, ma non può essere la stessa cosa di un ramo in un singolo repository. Quindi ci sono almeno due cose diverse che vengono chiamate rami. Ma poi, puoi anche riavvolgere in un repository e iniziare a modificare. È come il secondo tipo di ramo o di nuovo qualcosa di diverso? Forse dipende dal tipo di repo che hai - oh sì - a quanto pare nemmeno il repo è un concetto molto chiaro. Ci sono quelli normali e quelli spogli. Non è possibile passare a uno normale perché la parte nuda potrebbe non essere sincronizzata con il suo albero dei sorgenti. Ma non puoi importare in uno nudo perché non ci hanno pensato. Quindi devi cvsimportare in uno normale, clonalo su uno nudo che gli sviluppatori hanno colpito, e cvsexport quello su una copia di lavoro cvs che deve ancora essere archiviata in cvs. Chi può essere infastidito? Da dove vengono tutte queste complicazioni? Dall'idea distribuita stessa. Alla fine ho abbandonato la gitolite perché mi imponeva ancora di più di queste restrizioni.

Git dice che la ramificazione dovrebbe essere leggera, ma molte aziende hanno già un serio problema con le filiali canaglia, quindi avrei pensato che la ramificazione dovrebbe essere una decisione importante con una rigorosa polizia. È qui che per forza brilla davvero ...

In definitiva, raramente hai bisogno di branch perché puoi destreggiarti tra i changeset in modo molto agile. Ad esempio, il normale flusso di lavoro prevede la sincronizzazione con l'ultima versione valida nota sulla linea principale, quindi si scrive la funzione. Ogni volta che provi a modificare un file, il diff di quel file viene aggiunto al tuo "changeset predefinito". Quando provi a fare il check-in del changeset, esso cerca automaticamente di unire le notizie dalla mainline al tuo changeset (ribasandolo efficacemente) e poi esegue il commit. Questo flusso di lavoro viene applicato senza che tu debba nemmeno capirlo. Mainline raccoglie quindi una cronologia delle modifiche che puoi facilmente scegliere in seguito. Ad esempio, supponi di voler ripristinare uno vecchio, diciamo, quello prima di quello prima dell'ultimo. Ti sincronizzi con il momento prima della modifica incriminata, contrassegni i file interessati come parte del changeset, sincronizza con il momento successivo e unisci con "sempre mio". (C'era qualcosa di molto interessante qui: la sincronizzazione non significa avere la stessa cosa - se un file è modificabile (cioè in un changeset attivo) non verrà bloccato dalla sincronizzazione ma contrassegnato come dovuto per la risoluzione.) Ora hai una lista delle modifiche che annulla quella incriminata. Unisciti alle notizie successive e avrai una lista delle modifiche che puoi posizionare sopra la linea principale per avere l'effetto desiderato. In nessun momento abbiamo riscritto la storia. Unisciti alle notizie successive e avrai una lista delle modifiche che puoi posizionare sopra la linea principale per avere l'effetto desiderato. In nessun momento abbiamo riscritto la storia. Unisciti alle notizie successive e avrai una lista delle modifiche che puoi posizionare sopra la linea principale per avere l'effetto desiderato. In nessun momento abbiamo riscritto la storia.

Ora, supponendo a metà di questo processo, qualcuno ti corre incontro e ti dice di mollare tutto e correggere qualche bug. Devi solo dare un nome alla tua lista modifiche predefinita (un numero in realtà) quindi "sospenderla", correggere il bug nella lista modifiche predefinita ora vuota, eseguirne il commit e riprendere la lista modifiche denominata. È tipico avere diversi elenchi di modifiche sospesi in un momento in cui provi cose diverse. È facile e privato. Ottieni ciò che vuoi veramente da un regime di filiale senza la tentazione di procrastinare o di tirarti indietro dalla fusione con la linea principale.

Suppongo che sarebbe teoricamente possibile fare qualcosa di simile in git, ma git rende praticamente qualsiasi cosa possibile piuttosto che affermare un flusso di lavoro che approviamo. Il modello centralizzato è un insieme di valide semplificazioni relative al modello distribuito che è una generalizzazione non valida. È così generalizzato che in pratica si aspetta che tu implementi il ​​controllo del codice sopra di esso, come fa il repo.

L'altra cosa è la replica. In git, tutto è possibile quindi devi capirlo da solo. In definitiva, ottieni una cache effettivamente senza stato. L'unica configurazione che deve sapere è dove si trova il master ei client possono puntare al master o alla cache a loro discrezione. È un lavoro di cinque minuti e non può andare storto.

Hai anche trigger e moduli personalizzabili per affermare revisioni del codice, riferimenti a bugzilla ecc.E, naturalmente, hai rami per quando ne hai effettivamente bisogno. Non è chiaro, ma è vicino ed è estremamente facile da configurare e mantenere.

Tutto sommato, penso che se sai che lavorerai in modo centralizzato, cosa che fanno tutti, potresti anche usare uno strumento progettato pensando a questo. Git è sopravvalutato a causa della temibile arguzia di Linus insieme alla tendenza delle persone a seguirsi l'un l'altro come pecore, ma la sua principale ragion d'essere in realtà non regge il buon senso e, seguendolo, git lega le proprie mani con i due enormi dogmi che (a) il software e (b) i dati devono essere gli stessi sia sul client che sul server, e questo renderà sempre complicato e zoppo il lavoro centralizzato.


4
Oh, che diamine. Ho qualche minuto, quindi cercherò di commentare alcuni degli errori più grandi. "Se il kernel fosse gestito in modo distribuito, ciò significherebbe che non potrei effettivamente scaricare i sorgenti" ufficiali "del kernel - non ce ne sarebbero uno - dovrei decidere se voglio la versione di Linus o quella di Joe , o la versione di Bill. "- Non posso parlare specificamente al progetto del kernel Linux, dato che non ci ho mai lavorato, ma in generale, questo è in effetti il ​​modo in cui funziona il software open-source. Puoi scaricare qualsiasi fork che ti piace.
Marnen Laibow-Koser

2
"Quello che vogliamo davvero fare con tutte quelle vecchie cose è metterle in un armadio e dimenticare che sono lì, proprio come fa qualsiasi normale VCS. Il fatto che git lo trascini avanti e indietro sulla rete ogni giorno è molto pericoloso, perché ti tormenta a potarlo. " • Hai mai usato effettivamente Git? Git non ti chiede di potare il tuo repo. Inoltre, la compressione dei dati di Git è estremamente efficiente; non è raro che un repository Git, con una storia di branch complessa, sia significativamente più piccolo di una copia di lavoro SVN (senza cronologia) della stessa base di codice.
Marnen Laibow-Koser

4
"Ogni normale VCS rende la riscrittura della cronologia impossibile per tutti tranne che per gli amministratori e si assicura che gli amministratori non abbiano motivo di prenderla in considerazione. Correggimi se sbaglio, ma per quanto ne so, git non fornisce alcun modo per consentire agli utenti normali accedere ma vietare loro di riscrivere la cronologia. Ciò significa che qualsiasi sviluppatore con rancore (o che era ancora alle prese con la curva di apprendimento) potrebbe distruggere l'intero codice. " • Ti sbagli al 100%. È facile disabilitare i push forzati al repository pur consentendo l'accesso in scrittura. Inoltre, tutti possono avere una copia di tutto il repository che desiderano, quindi il trashing non funzionerebbe.
Marnen Laibow-Koser

3
"Git dice che le ramificazioni dovrebbero essere leggere, ma molte aziende hanno già un serio problema con le filiali non autorizzate, quindi avrei pensato che la ramificazione dovrebbe essere una decisione importante con una rigorosa polizia. È qui che per forza brilla davvero ..." • Che cos'è un "problema ramo canaglia"? Perché pensi che la ramificazione dovrebbe essere una "decisione importante"? In pratica, è davvero utile poter creare rami (privati ​​o pubblici) per ogni nuova funzionalità o esperimento, in modo che ognuno viva nel proprio universo alternativo. A differenza, ad esempio, di SVN, Git rende facile l'unione in modo che funzioni molto bene.
Marnen Laibow-Koser

3
Il fatto che questa risposta abbia solo un voto negativo oltre al mio (apparentemente @Marnen) mi stupisce visto quanto sia oggettivamente sbagliata questa risposta.
alternativa

-8

L'uso di GIT come sostituto di una cattiva gestione della riga di codice è comune. Molti degli svantaggi di Perforce sono il risultato di cattive strategie di ramificazione. Lo stesso per qualsiasi altro strumento centralizzato. Se devi creare un sacco di rami, stai facendo qualcosa di sbagliato. Perché gli sviluppatori devono creare così tanti rami?

Inoltre, perché è comunque così importante lavorare disconnesso? Solo così qualcuno può lavorare su un treno? È quasi l'unico posto in cui in questi giorni non è possibile ottenere una connessione wireless. E anche la maggior parte dei treni ha un WiFi decente.


9
Ad alcuni sviluppatori piace creare rami in modo che possano facilmente isolare e segmentare diversi sviluppi, prototipi, correzioni di bug, ecc. Spesso dipende dal tipo di lavoro. I rami Perforce sono piuttosto pesanti da gestire rispetto ai rami Git e Mercurial, e quindi ci possono essere dei veri miglioramenti della produttività da apportare.
Greg Whitfield

8
La capacità di lavorare disconnesso non è sempre correlata all'idea di lavorare su un treno o un aereo. Alcune aziende potrebbero non disporre di un'infrastruttura di rete affidabile. Oppure si possono verificare interruzioni, manutenzione del server, errori generali, ecc. Ma l'effetto collaterale di poter lavorare disconnesso è che le operazioni di controllo del codice sorgente sono incredibilmente veloci rispetto ai sistemi che si basano su un viaggio di andata e ritorno di rete per fare qualsiasi cosa.
Greg Whitfield

6
Nella mia esperienza, l'utilizzo del processo per controllare le persone è indicativo di una cattiva progettazione del flusso di lavoro in primo luogo. Dovrebbe esistere un flusso di lavoro per mantenere le persone produttive. Se non viene utilizzato, c'è qualcosa che non va, perché in generale le persone non sono idiote e useranno uno strumento migliore se lo incontrano.
Carl,

6
Downvoting a causa di "Se devi creare un sacco di rami stai facendo qualcosa di sbagliato". Ciò potrebbe essere vero in un VCS centralizzato con strumenti di fusione inadeguati (come SVN o CVS - mai utilizzato Perforce). Non è vero in Git, dove ramificazioni e fusioni sono facili e comuni. Questo dà la libertà per ogni funzionalità in fase di sviluppo di trovarsi nel proprio universo alternativo fino all'integrazione. Personalmente, non tornerei mai in un ambiente in cui non potrei ramificarmi per capriccio.
Marnen Laibow-Koser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.