Полагаться на git rev-list
не всегда достаточно, потому что это
Список [s] коммитов, которые доступны при переходе по родительским ссылкам из
данный коммит (ы) [..]
(git help rev-list
)
Таким образом, он не перечисляет коммиты, которые находятся в другой ветви, и не перечисляет коммиты, которые недоступны какой-либо ветви (возможно, они были созданы из-за некоторых действий rebase
и / или отсоединенной головы).
Аналогично, git log
просто следует за родительскими ссылками из текущего извлеченного коммита. Опять же, вы не видите коммиты, на которые ссылаются другие ветки или которые находятся в зависшем состоянии.
Вы действительно можете получить все коммиты с помощью команды, подобной этой:
for i in `(find .git/objects -type f |
sed 's@^.*objects/\(..\)/\(.\+\)$@\1\2@' ;
git verify-pack -v .git/objects/pack/*.idx |
grep commit |
cut -f1 -d' '; ) | sort -u`
do
git log -1 --pretty=format:'%H %P %ai %s%n' $i
done
Для простоты тело цикла печатает для каждого коммита одну строку, содержащую его хэш, родительский хэш (ы), дату и тему. Обратите внимание, что для итерации по всем коммитам необходимо учитывать упакованные и еще не упакованные объекты.
Вы можете напечатать ссылочные BLOB-объекты (и только созданные), вызвав git diff-tree $i
(и greping для capitial A
в пятом столбце) из тела цикла.