16

コミットごとに出力できる git コマンドはありますか。

  1. ID
  2. 主題
  3. パスとサイズで作成されたブロブ (同様ですgit ls-tree -l -r <commit>が、作成されたブロブのみ)
4

6 に答える 6

26

コミットを取得するには (すべて、コミットごとに 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>

そして別の時間にちょっとした解析

于 2009-08-23T15:50:58.013 に答える
12

頼るだけで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

于 2012-04-21T09:16:12.820 に答える
5

サイズ以外のすべてを箱から出すことができます。これはかなり近いです:

git log --name-status
于 2009-08-22T04:35:46.587 に答える
4

ティグの答えに基づく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
}

最適なコードではないかもしれませんが、ほとんどの場合は理解できるはずです。

于 2012-03-13T02:20:15.187 に答える
2

を検索するときのもう 1 つの便利なコマンド

git fsck --lost-found

ダングリングコミットが表示されます。これを使用して、タイミングの悪いリセット --hard で消去されたコミット ai を見つける必要がありました

しかし、私の言葉を鵜呑みにしないでください。

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

于 2013-05-14T14:59:22.993 に答える
0

次のコマンドを使用して、すべてのコミット (ぶら下がっているものを含む)のリストを取得することもできます。

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

この行を gitk の新しいビューの設定 (最後の入力フィールドに、追加のコミットを生成するコマンド) に含めると、プロジェクトの「忘れられた履歴」も示すツリーが表示されます。

于 2012-11-08T10:39:25.267 に答える