Подтвердить что ты не робот

Git - получить все коммиты и капли, которые они создали

Есть ли команда git, которая может выводиться для каждой фиксации:

  • ID
  • Заголовок
  • blobs, созданный с помощью их пути и размера (например, git ls-tree -l -r <commit>, но только для созданных капли)
4b9b3361

Ответ 1

Чтобы получить коммиты (все и вывести одну строку за фиксацию):

git rev-list --all --pretty=oneline

Затем split фиксируется пробелом с пределом 2 и получает каждый идентификатор фиксации и сообщение

Чтобы получить blobs, созданный commit (recurse to subdirs, show merge commits, обнаружение переименований и копий, не показывать идентификатор фиксации в первой строке):

git diff-tree -r -c -M -C --no-commit-id <commit-sha>

Немного разборки каждой строки и исключение некоторых из них - и мы получаем список новых blob и их путь для фиксации

Последний должен получить размеры блоков:

git cat-file --batch-check < <list-of-blob-shas>

И еще раз немного разбора

Ответ 2

Оказываясь на git rev-list, не всегда достаточно, потому что он

Список [s] совершает транзакции, которые достижимы, следуя родительским ссылкам из        заданные фиксации [..]

(git help rev-list)

Таким образом, он не перечисляет коммиты, которые находятся на другой ветке, и не перечисляет коммиты, недоступные какой-либо ветке (возможно, они были созданы из-за некоторых действий rebase и/или отдельных элементов).

Аналогично, git log просто следует за родительскими ссылками из текущей проверенной фиксации. Опять же, вы не видите коммиты, на которые ссылаются другие ветки или находящиеся в обвисшем состоянии.

Вы можете получить все коммиты с такой командой:

for i in `(find .git/objects  -type f |
             sed '[email protected]^.*objects/\(..\)/\(.\+\)[email protected]\1\[email protected]' ;
           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

Чтобы сделать это простым, тело цикла печатает для каждой фиксации одну строку, содержащую ее хэш, родительский хеш (ы), дату и тему. Обратите внимание, что для повторения всех коммитов вам необходимо учитывать упакованные и еще не упакованные объекты.

Вы можете распечатать связанные капли (и только созданные), вызвав git diff-tree $i (и greping для capitial A в пятом столбце) из тела цикла.

Ответ 3

Вы можете получить все, кроме размера, из коробки. Это довольно близко:

git log --name-status

Ответ 4

Одно решение, основанное на ответе tig:

#!/usr/bin/perl

foreach my $rev (`git rev-list --all --pretty=oneline`) {
  my $tot = 0;
  ($sha = $rev) =~ s/\s.*$//;
  foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) {
    $blob = (split /\s/, $blob)[3];
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted
    my $size = `echo $blob | git cat-file --batch-check`;
    $size = (split /\s/, $size)[2];
    $tot += int($size);
  }
  print "$tot $rev" if $tot > 1000000; # Show only if > 1MiB
}

Возможно, это не лучший код, но вам нужно больше всего.

Ответ 5

Другая полезная команда при поиске

git fsck --lost-found

покажет оборванные коммиты. Мне нужно было использовать это, чтобы найти фиксацию, которую я уничтожил с неустановленным reset --hard

Но не верьте мне на слово:

https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html

Ответ 6

Вы также можете получить список всех коммитов (включая оборванных):

git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'

Включите эту строку в настройки для нового представления в gitk (в последнем поле ввода, команде для генерации дополнительных коммитов), и вы получите дерево, которое также отобразит "забытую историю" проекта.