Есть ли команда git, которая может выводиться для каждой фиксации:
- ID
- Заголовок
- blobs, созданный с помощью их пути и размера (например,
git ls-tree -l -r <commit>
, но только для созданных капли)
Есть ли команда git, которая может выводиться для каждой фиксации:
git ls-tree -l -r <commit>
, но только для созданных капли)Чтобы получить коммиты (все и вывести одну строку за фиксацию):
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>
И еще раз немного разбора
Оказываясь на 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
в пятом столбце) из тела цикла.
Вы можете получить все, кроме размера, из коробки. Это довольно близко:
git log --name-status
Одно решение, основанное на ответе 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
}
Возможно, это не лучший код, но вам нужно больше всего.
Другая полезная команда при поиске
git fsck --lost-found
покажет оборванные коммиты. Мне нужно было использовать это, чтобы найти фиксацию, которую я уничтожил с неустановленным reset --hard
Но не верьте мне на слово:
https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html
Вы также можете получить список всех коммитов (включая оборванных):
git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'
Включите эту строку в настройки для нового представления в gitk (в последнем поле ввода, команде для генерации дополнительных коммитов), и вы получите дерево, которое также отобразит "забытую историю" проекта.