コミットごとに出力できる git コマンドはありますか。
- ID
- 主題
- パスとサイズで作成されたブロブ (同様です
git ls-tree -l -r <commit>
が、作成されたブロブのみ)
コミットを取得するには (すべて、コミットごとに 1 行を出力):
git rev-list --all --pretty=oneline
次に、コミットを 2 の制限でスペースごとに分割し、すべてのコミット ID とメッセージを取得します
コミットによって作成された BLOB を取得するには (サブディレクトリに再帰し、マージ コミットを表示し、名前変更とコピーを検出し、最初の行にコミット ID を表示しません):
git diff-tree -r -c -M -C --no-commit-id <commit-sha>
すべての行を少し解析し、それらの一部を除外します。新しいブロブのリストとコミットのパスを取得します
最後に、ブロブ サイズを取得します。
git cat-file --batch-check < <list-of-blob-shas>
そして別の時間にちょっとした解析
頼るだけでgit rev-list
は必ずしも十分ではない
指定されたコミットから親リンクをたどることによって到達可能なコミットを一覧表示します [..]
( 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
シンプルにするために、ループ本体はコミットごとに、そのハッシュ、親ハッシュ、日付、件名を含む 1 行を出力します。すべてのコミットを反復するには、パックされたオブジェクトとまだパックされていないオブジェクトを考慮する必要があることに注意してください。
ループ本体から呼び出すgit diff-tree $i
(および 5 列目の大文字を grepする) ことにより、参照された BLOB (および作成されたもののみ) を出力できます。A
サイズ以外のすべてを箱から出すことができます。これはかなり近いです:
git log --name-status
ティグの答えに基づく1つの解決策:
#!/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
}
最適なコードではないかもしれませんが、ほとんどの場合は理解できるはずです。
を検索するときのもう 1 つの便利なコマンド
git fsck --lost-found
ダングリングコミットが表示されます。これを使用して、タイミングの悪いリセット --hard で消去されたコミット ai を見つける必要がありました
しかし、私の言葉を鵜呑みにしないでください。
https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html
次のコマンドを使用して、すべてのコミット (ぶら下がっているものを含む)のリストを取得することもできます。
git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'
この行を gitk の新しいビューの設定 (最後の入力フィールドに、追加のコミットを生成するコマンド) に含めると、プロジェクトの「忘れられた履歴」も示すツリーが表示されます。