2010-07-21 42 views
7

Estoy tratando de entender un proyecto, ayuda a ver su evolución usando gitk. Lo que hago es verificar el primer commit, entender el código, ejecutar tests, ir al siguiente commit y repetir. Mi flujo de trabajo actual es a la comprobación de la confirmación a través de su hash¿Cómo pasar por un repositorio de git?

git checkout 79cd6 

Pero lo que me gustaría es otra rama donde puedo realizar mis propios cambios, y me permite fusionar confirmaciones de la rama principal, pero sin la necesidad de encuentra el commit hash. Flujo de trabajo idealizado:

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

Respuesta

1

Puede escribir un pequeño script de shell. Un script se ejecutaría git log --pretty=oneline | awk '{print $1;}'. La segunda secuencia de comandos (llámelo step o algo similar) usaría head, tail, wc -l. Luego lea la última línea del archivo con tail, descubra cuántas líneas hay en el archivo y elimine la última línea del archivo. Feo, claro, pero haría el trabajo. :) (Si quisiera ser un poco menos feo, podría usar truncate(1) para cortar la última línea del archivo, en lugar de crear siempre archivos temporales nuevos).

2

Guárdelo como ~/bin/git-next o en otro lugar de su ruta:

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

Esto echa un vistazo al primer hijo de la revisión actual.

Será muy lento en un gran repositorio, pero hará el trabajo.

Puede modificar esto para gestionar su bifurcación según sea necesario.

+0

Si la velocidad es un problema, puede almacenar la salida de 'git rev-list ', y simplemente busque la línea con su HEAD actual y mire la línea anterior. – Cascabel

7

Sé que esta es una pregunta un poco vieja, pero quería hacer lo mismo y encontrar una respuesta, así que pensé en compartirla.

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

hacer esto en una ventana. Comenzará con su confirmación inicial y avanzará una vez cada vez que presione enter. Luego haz tus pruebas, etc. en un caparazón diferente.
Funcionará perfectamente con una historia lineal, pero no estoy muy seguro de cómo manejará fusiones y cosas por el estilo. Estoy seguro de que será razonable, pero su kilometraje puede variar un poco.

+1

¡Funcionó como un encanto! También puede usar 'git rev-list master^[hash of first commit para checkout]^--reverse' si no desea consultar el historial completo. – CletusW

+0

También agregaría 'git checkout master' al final para que termine en la rama correcta. – CletusW

+0

Aquí está mi archivo bash resultante: https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW

0

Quería una manera fácil de pasar por las confirmaciones en una sucursal para la revisión/demostración del código. Este es el pequeño guión que se me ocurrió para automatizarlo. La caída de la siguiente en un archivo, por ejemplo, git_step y ejecutarlo así: 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}; 

También disponible como gist here.

Cuestiones relacionadas