2009-03-26 18 views
26

Ho due diverse esportazioni del nostro repository CVS in git. A un certo punto divergono, e sto facendo delle ricerche sul perché. La linea di sviluppo risale a diversi anni e oltre decine di migliaia di commit.Come faccio a confrontare due repository git?

All'inizio della riga di sviluppo, gli ID SHA1 per ogni commit sono identici, mi dicono che git-cvsimport è molto coerente su ciò che sta facendo quando legge i risultati di cvsps e importazioni.

Ma a un certo punto tra il primo commit e ieri, gli ID SHA1 iniziano a divergere. Mi piacerebbe scoprire dove si trova confrontando un elenco di ID di commit da ciascun repository e cercando di vedere cosa manca. Ci sono buoni strumenti o tecniche per farlo?

risposta

16

Perché non limitarsi a catalogare il registro git di ciascun repository in un proprio file e confrontarlo? La differenza più vicina al fondo del file è dove hanno iniziato a divergere ...

+0

Questo è in realtà ciò che ho fatto ieri, anche se oggi sto diventando un po 'più avanzato con alcuni suggerimenti delle altre risposte. – skiphoppy

+3

vedere dove due repository hanno iniziato a divergere è molto lontano dal dirmi le differenze create da quella divergenza. – masukomi

+0

Scusa ma non è questa la domanda. La domanda è come confrontare due repository. La risposta è sotto – awm

6

Il modo ovvio sarebbe quello di clonare un repository, recuperare la punta del ramo principale dell'altro repository nel clone e utilizzare git merge-base sui due suggerimenti per trovare l'antenato comune.

30

Poiché i due repository git iniziano lo stesso, è possibile trascinare entrambi nello stesso repository funzionante.

$ git remote add cvsimport-a git://.../cvsimport-a.git 
$ git remote add cvsimport-b git://.../cvsimport-b.git 
$ git remote update 
$ git log cvsimport-a/master..cvsimport-b/master # in B, not in A? 
$ git log cvsimport-b/master..cvsimport-a/master # in A, not in B? 
+0

Probabilmente avrete bisogno di cvsimport-a/master e cvsimport-b/master in questi comandi.Inoltre, puoi eseguire "git update remoto" invece di eseguire il piping su xargs git fetch. –

+0

Originariamente stavo per scrivere 'git remote fetch cvsimport-a; git remote fetch cvsimport-b' (non aggiornando altri telecomandi), ma poi ho cambiato idea ... fatto. Git si lamenta un po 'se si interrompe/master ma funziona. Lo cambierò per chiarezza. Il collegamento Suggerimenti e trucchi – ephemient

12

In uno dei tuoi pronti contro termine, effettuare le seguenti operazioni:

$ git remote add other-repo git://.../other-repo.git 
$ git remote update 
$ git log other-repo/master...master 
    # or maybe: 
$ gitk master... other-repo/master 

Questo vi dà la differenza simmetrica tra due pronti contro termine; questo mostra tutti i commit che sono in un repository, ma non l'altro.

0

si può mettere (fetch) entrambi i repository in unico repository, sia nuovo, o uno dei esistenti, come nelle risposte da ephemient, Charles Bailey e Brian Campbell. Oppure puoi usare il trucco dalla pagina Tips and Tricks su Git Wiki, o per essere più esatti nella domanda "Come confrontare due repository locali" lì.

Ma potrebbe essere più semplice generare un elenco di SHA-1 di commit in ordine topologico utilizzando "git rev-list" (o "git-log" con le opzioni appropriate) e controllare la prima revisione che differiscono.

+0

fornisce "Non trovato", è stato spostato o è scomparso? – Chris

+0

Git Wiki è passato prima da http://git.or.cz a http://git.wiki.kernel.org, ma secondo dopo l'irruzione in kernel.org non è ancora tornato (e non è noto se sarebbe essere lì, o forse da qualche parte su http://git-scm.com). http://git.wiki.kernel.org è in modalità di sola lettura, quindi tutti i link sono stati modificati. ** Tips and Tricks ** (aka ** GitTips **) è disponibile qui: https://git.wiki.kernel.org/articles/g/i/t/GitTips_81aa.html –

0

Ho avuto una necessità simile di recente. Avevo un progetto remoto clonato che dovevo confrontare con una base di codice copiata corrente. I log git non erano rilevanti, perché i commit non avevano nulla in comune, e non ero sicuro che fossero derivati ​​dalla stessa base di codice.

Per risolvere il problema, ho usato git in modo brutale. Ho copiato i file da controllare nel repository git, quindi ho controllato il file git status per un elenco di file modificati.

Inoltre, git diff <filename> può anche essere utilizzato per ispezionare ulteriormente. Sono stato in grado di confrontare i file entro

Problemi correlati