Как пройти через репозиторий git? - PullRequest
8 голосов
/ 21 июля 2010

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

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>

Ответы [ 4 ]

8 голосов
/ 11 октября 2013

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

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

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

2 голосов
/ 21 июля 2010

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

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

Это проверит первого потомка текущей ревизии.

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

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

0 голосов
/ 25 мая 2014

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

Также доступно здесь как .

0 голосов
/ 21 июля 2010

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

...