2010-07-21 2 views
7

Я пытаюсь понять проект, он помогает взглянуть на его эволюцию, используя gitk. То, что я делаю, это проверка первой фиксации, понимание кода, запуск тестов, переход к следующей фиксации и повторение. Мой текущий рабочий процесс является проверка фиксации через его хэшКак пройти через репозиторий git?

git checkout 79cd6 

Но то, что я хотел бы еще одно отделение, где я могу выполнять свои собственные изменения, и позволяет мне объединить совершающее от главного отделения, но без необходимости найти хеш фиксации. Идеализированный рабочий процесс:

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

ответ

1

Вы можете написать небольшой скрипт оболочки. Один скрипт будет запускать git log --pretty=oneline | awk '{print $1;}'. Второй скрипт (назовите его step или что-то) будет использовать head, tail, wc -l. Затем прочитайте последнюю строку файла с tail, узнайте, сколько строк в файле, и удалите последнюю строку из файла. Уродливо, конечно, но это сработало. :) (Если вы хотели быть немного менее уродливым, он мог бы использовать truncate(1), чтобы просто отрубить последнюю строку файла, а не всегда создавать новые временные файлы.)

2

Сохраните это как ~/bin/git-next или где-нибудь еще в вашем путь:

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

Это проверит первого ребенка текущей версии.

Это будет очень медленно на большом репо, но он будет выполнять эту работу.

Вы можете изменить это, чтобы обрабатывать ветвление по мере необходимости.

+0

Если скорость является проблемой, вы можете сохранить вывод 'git rev-list ' и просто найти строку с вашим текущим HEAD на ней и проверить линию раньше. – Cascabel

7

Я знаю, что это старый вопрос, но я хотел сделать то же самое и нашел ответ, поэтому решил, что поделюсь.

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

сделать это в одном окне. Он начнется с вашего первоначального коммита и будет продвигаться один раз каждый раз, когда вы нажимаете enter. Затем сделайте свое тестирование и т. Д. В другой оболочке.
Он отлично работает с линейной историей, но я не совсем уверен, как он будет обрабатывать слияния и т. Д. Я уверен, что это будет разумно, но ваш пробег может немного измениться.

+1

Работал как шарм !! Вы также можете использовать 'git rev-list master^[хэш первой фиксации для проверки]^--reverse', если вы не хотите проверять всю историю. – CletusW

+0

Я бы также добавил 'git checkout master' до конца, чтобы вы вернулись на правильную ветку. – CletusW

+0

Вот мой итоговый файл bash: https://gist.github.com/cletusw/a2381514ecbd0c2c48dc – CletusW

0

Мне нужен простой способ пройти через фиксации в ветке для просмотра/демонстрации кода. Это маленький сценарий, который я придумал для его автоматизации. Отбросьте следующее в файле, скажем, git_step и запустить его следующим образом: 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}; 

Также доступна как gist here.

Смежные вопросы