2010-07-21 18 views
7

Sto cercando di capire un progetto, aiuta a vedere la sua evoluzione usando gitk. Quello che faccio è fare il checkout del primo commit, capire il codice, eseguire test, andare al prossimo commit e ripetere. Il mio flusso di lavoro corrente è alla cassa commit attraverso il suo hashCome passare attraverso un repository git?

git checkout 79cd6 

Ma quello che vorrei è un altro ramo dove posso eseguire le mie modifiche, e mi permette di fondere impegna dal ramo principale, ma senza la necessità di trova l'hash di commit. Flusso di lavoro ottimizzato:

git checkout -b <newbranch> <first commit id of master> 
git <command to move head of current branch to next commit of master> 

risposta

1

Si potrebbe scrivere un piccolo script di shell. Uno script avrebbe eseguito git log --pretty=oneline | awk '{print $1;}'. Il secondo script (chiamalo step o qualcosa del genere) usa head, tail, wc -l. Quindi leggi l'ultima riga del file con tail, scopri quante righe ci sono nel file e rimuovi l'ultima riga dal file. Brutto, certo, ma farebbe il lavoro. :) (Se vuoi essere un po 'meno brutto, puoi usare truncate(1) per tagliare semplicemente l'ultima riga del file, invece di creare sempre nuovi file temporanei.)

2

Salva questo come ~/bin/git-next o da qualche altra parte nel tuo percorso:

#!/bin/bash 
git co $(git rev-list --children --all | awk "/^$(git rev-parse @\{0})/ { print \$2; }") 

Verificherà il primo figlio della revisione corrente.

Sarà molto lento su un grande repo ma sarà il lavoro.

È possibile modificare questo per gestire la ramificazione in base alle esigenze.

+0

Se la velocità è un problema, è possibile memorizzare l'output di 'git rev-list ', e trovare la linea con l'HEAD corrente su di esso e controllare la linea prima. – Cascabel

7

So che questa è una domanda un po 'vecchia, ma volevo fare la stessa cosa e ho trovato una risposta, quindi ho pensato di condividere.

for commit in $(git rev-list master --reverse) 
do 
    git checkout $commit 
    read 
done 

fare questo in una sola finestra. Inizia con il commit iniziale e avanza una volta ogni volta che premi Invio. Quindi esegui i tuoi test, ecc. In una shell diversa.
Funzionerà perfettamente con una cronologia lineare, ma non sono abbastanza sicuro di come gestirà l'unione e così via. Sono sicuro che sarà ragionevole, ma il tuo chilometraggio potrebbe variare un po '.

+1

Ha funzionato come un fascino !! Puoi anche usare 'git rev-list master^[hash del primo commit alla cassa]^--reverse' se non vuoi controllare l'intera cronologia. – CletusW

+0

Vorrei anche aggiungere 'git checkout master' alla fine in modo da tornare al ramo corretto. – CletusW

+0

Ecco il mio file bash risultante: https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW

0

Volevo un modo semplice per passare attraverso i commit in un ramo per la revisione del codice/demo. Questa è la piccola sceneggiatura che ho inventato per automatizzarla. Drop il seguente in un file, per esempio, git_step ed eseguirlo in questo modo: git_step d17dacce8b13b2ad454003da7cbd670a06c41437

#!/bin/bash 

BASE_REV=${BASE_REV:-$1}; 
current_branch=$(git branch | grep '^*' | awk '{print $2}'); 

for rev in $(git rev-list ${BASE_REV}..HEAD | tail -r); do 
    git checkout $rev; 
    LESS='RSX' git show -p $rev; 
done; 

git checkout ${current_branch}; 

Disponibile anche come gist here.

Problemi correlati