20

git-1.7.4.1 を使用して、オブジェクト データベースの破損がユーザーにどれだけ早く警告されるかを判断しようとして、1 ビットの切り替えを行いました。

$ git init リポジトリ
/tmp/repo/.git/ で空の Git リポジトリを初期化しました
$ cd リポジトリ
$ echo '非常に重要な情報' >critical
$ git add クリティカル
$ git commit -m クリティカル
[マスター (ルートコミット) c4d6d90] 重要
 1 ファイル変更、1 挿入 (+)、0 削除 (-)
 作成モード 100644 クリティカル
$ git ls-tree HEAD
100644 ブロブ 82d423c32c4bb2c52938088e0234db041bf4eaaf クリティカル
$ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
非常に重要な情報
$ echo '非常に重要な情報' | git ハッシュ オブジェクト --stdin -w
81a3797afe76d339db25c0f9c705a6caa47279c2
$ mv .git/objects/81/a3797afe76d339db25c0f9c705a6caa47279c2 \
     .git/オブジェクト/82/d423c32c4bb2c52938088e0234db041bf4eaaf

git-fsck告知はもちろん

$ git fsck
エラー: sha1 の不一致 82d423c32c4bb2c52938088e0234db041bf4eaaf

エラー: 82d423c32c4bb2c52938088e0234db041bf4eaaf: オブジェクトが破損しているか見つからない
欠落しているブロブ 82d423c32c4bb2c52938088e0234db041bf4eaaf

しかしgit-log、変化に満足しています

$ git ログ -p
コミット c4d6d90467af9ffa94772795d5c5d191228933c1
著者: グレッグ・ベーコン <gbacon@dbresearch.net>
日付: 2011 年 4 月 7 日木曜日 12:20:53 -0500

    致命的

diff --git a/クリティカル b/クリティカル
新しいファイル モード 100644
インデックス 0000000..82d423c
--- /dev/null
+++ b/クリティカル
@@ -0,0 +1 @@
+非常に重要な情報

そのままgit-checkout

$ rm クリティカル
$ git チェックアウト .
$ 猫クリティカル
非常に重要な情報

の特定の呼び出しによりgit-show、破損が明らかになります

$ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
エラー: sha1 の不一致 82d423c32c4bb2c52938088e0234db041bf4eaaf

致命的: 不良オブジェクト 82d423c32c4bb2c52938088e0234db041bf4eaaf

しかし、より広いものではありません。

$ git ショー
コミット c4d6d90467af9ffa94772795d5c5d191228933c1
著者: グレッグ・ベーコン <gbacon@dbresearch.net>
日付: 2011 年 4 月 7 日木曜日 12:20:53 -0500

    致命的

diff --git a/クリティカル b/クリティカル
新しいファイル モード 100644
インデックス 0000000..82d423c
--- /dev/null
+++ b/クリティカル
@@ -0,0 +1 @@
+非常に重要な情報

さえgit-clone気付かない!

$ CD ..
$ git clone レポクローン
クローンにクローンしています...
終わり。
$ 猫のクローン/クリティカル
非常に重要な情報

整合性チェックを実行する特定の git コマンド モード (たとえばgit show $sha1存在する必要があるが、git showまたは存在しない) の完全なリストは何ですか?git show HEAD

4

2 に答える 2

6

Mark Longairの答えに応えて、私はcscopeを起動し、次のことを発見しました。

cscopeにはcursesインターフェースがあり、興味をそそられた場合に備えてVimにうまく統合されていることに注意してください

Functions calling this function: parse_object

  File              Function                       Line
0 bundle.c          verify_bundle                   110 struct object *o = parse_object(e->sha1);
1 bundle.c          create_bundle                   242 struct object *object = parse_object(sha1);
2 bundle.c          create_bundle                   247 struct object *object = parse_object(sha1);
3 bundle.c          create_bundle                   323 obj = parse_object(sha1);
4 commit.c          lookup_commit_reference_gently   30 struct object *obj = deref_tag(parse_object(sha1), NULL, 0);
5 http-backend.c    show_text_ref                   372 struct object *o = parse_object(sha1);
6 http-push.c       one_remote_object               742 obj = parse_object(sha1);
7 http-push.c       add_remote_info_ref            1530 o = parse_object(ref->old_sha1);
8 log-tree.c        add_ref_decoration               93 struct object *obj = parse_object(sha1);
9 merge-recursive.c get_ref                        1664 object = deref_tag(parse_object(sha1), name, strlen(name));
a pack-refs.c       handle_one_ref                   43 struct object *o = parse_object(sha1);
b pretty.c          format_commit_one               835 parse_object(commit->object.sha1);
c reachable.c       add_one_reflog_ent              122 object = parse_object(osha1);
d reachable.c       add_one_reflog_ent              125 object = parse_object(nsha1);
e reachable.c       add_one_ref                     133 struct object *object = parse_object(sha1);
f reflog-walk.c     fake_reflog_parent              234 commit_info->commit = (struct commit *)parse_object(reflog->osha1);
g refs.c            peel_ref                        647 o = parse_object(base);
h refs.c            write_ref_sha1                 1452 o = parse_object(sha1);
i remote.c          ref_newer                      1482 o = deref_tag(parse_object(old_sha1), NULL, 0);
j remote.c          ref_newer                      1487 o = deref_tag(parse_object(new_sha1), NULL, 0);
k revision.c        add_head_to_pending             166 obj = parse_object(sha1);
l revision.c        get_reference                   176 object = parse_object(sha1);
m revision.c        handle_commit                   196 object = parse_object(tag->tagged->sha1);
n revision.c        handle_one_reflog_commit        855 struct object *o = parse_object(sha1);
o server-info.c     add_info_ref                     12 struct object *o = parse_object(sha1);
p sha1_name.c       peel_to_type                    508 o = parse_object(sha1);
q sha1_name.c       peel_to_type                    511 if (!o || (!o->parsed && !parse_object(o->sha1)))
r sha1_name.c       peel_onion                      573 o = parse_object(outer);
s sha1_name.c       peel_onion                      578 if (!o || (!o->parsed && !parse_object(o->sha1)))
t sha1_name.c       handle_one_ref                  698 struct object *object = parse_object(sha1);
u sha1_name.c       get_sha1_oneline                740 if (!parse_object(commit->object.sha1))
v tag.c             deref_tag                        16 o = parse_object(((struct tag *)o)->tagged->sha1);
w tree.c            parse_tree_indirect             271 struct object *obj = parse_object(sha1);
x tree.c            parse_tree_indirect             284 parse_object(obj->sha1);
y upload-pack.c     got_sha1                        342 o = parse_object(sha1);
z upload-pack.c     reachable                       382 parse_object(commit->object.sha1);
A upload-pack.c     receive_needs                   526 object = parse_object(sha1);
B upload-pack.c     send_ref                        644 struct object *o = parse_object(sha1);
C upload-pack.c     mark_our_ref                    670 struct object *o = parse_object(sha1);
D walker.c          loop                            182 parse_object(obj->sha1);
于 2011-04-07T23:21:54.990 に答える
6

これを見つける方法を次に示します。ただし、各ソース ファイルを調べて、チェックが実行される条件を特定するつもりはありません。:)

git のソース コードを複製します。

git clone git://git.kernel.org/pub/scm/git/git.git

気になるバージョンをチェックしてください:

cd git
git checkout v1.7.1

そのエラー メッセージを探します。

git grep 'sha1 mismatch'

object.cそれはあなたを機能に導きますparse_object。次に、その関数を探します。

git grep parse_object

...そして、その関数が呼び出される条件をチェックする38個のファイルを調べます。

于 2011-04-07T19:13:49.927 に答える