哪些git命令执行完整性检查? [英] Which git commands perform integrity checks?

查看:175
本文介绍了哪些git命令执行完整性检查?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



<$ p $尝试确定用户在使用git-1.7.4.1的对象数据库中发生损坏的速度有多快, p> $ git init repo
在/tmp/repo/.git/
$ cd repo
$ echo'非常重要的信息'> critical
$ git add中初始化的空Git仓库危急
$ git commit -m危急
[master(root-commit)c4d6d90]危急
1个文件改变,1个插入(+),0个删除( - )
创建模式100644 critical
$ git ls-tree HEAD
100644 blob 82d423c32c4bb2c52938088e0234db041bf4eaaf critical
$ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
非常重要的信息
$ echo'非常重要的信息'| git hash-object --stdin -w
81a3797afe76d339db25c0f9c705a6caa47279c2
$ mv .git / objects / 81 / a3797afe76d339db25c0f9c705a6caa47279c2 \
.git / objects / 82 / d423c32c4bb2c52938088e0234db041bf4eaaf

当然, git-fsck 通知

 $ git fsck 
错误:sha1不匹配82d423c32c4bb2c52938088e0234db041bf4eaaf

错误:82d423c32c4bb2c52938088e0234db041bf4eaaf:object corrupt or missing
missing blob 82d423c32c4bb2c52938088e0234db041bf4eaaf

但是 git-log 对变更感到满意

 $ git log -p 
提交c4d6d90467af9ffa94772795d5c5d191228933c1
作者:Greg Bacon< gbacon@dbresearch.net>
日期:四月7日12:20:53 2011 -0500

危急

diff --git a / critical b / critical
新文件模式100644
index 0000000..82d423c
--- / dev / null
+++ b / critical
@@ -0,0 +1 @@
+非常重要的信息

原样 git-checkout

 $ rm危急
$ git checkout。
$ cat critical
非常重要的信息

具体调用 git-show 揭露腐败
$ b $ $ p $ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
错误:sha1不匹配82d423c32c4bb2c52938088e0234db041bf4eaaf

致命错误对象82d423c32c4bb2c52938088e0234db041bf4eaaf

但不是更广泛的。

 $ git show 
commit c4d6d90467af9ffa94772795d5c5d191228933c1
作者:Greg Bacon< gbacon@dbresearch.net>
日期:四月七日12:20:53 2011 -0500

危急

diff --git a / critical b / critical
新文件模式100644
index 0000000..82d423c
--- / dev / null
+++ b / critical
@@ -0,0 +1 @@
+非常重要的信息

甚至 git-clone 不会注意!

$ $ $ $ $ $ $ $ $ $ git克隆回购克隆
克隆到克隆..
完成。
$ cat clone / critical
非常重要的信息

特定git命令模式的完整列表( eg eg git show $ sha1 应该存在但不是 git show git show HEAD )执行完整性检查?

解决方案

为了回应Mark Longair的回答,我启动了cscope并发现:
$ b

注意cscope如何具有curses接口,并且很好地集成到Vim中,以防您的兴趣被激怒)

b
$ b

 调用此函数的函数:parse_object 

文件函数行
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(外);
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);
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);


Trying to determine how quickly a user would be warned of corruption in the object database with git-1.7.4.1, I pulled a one-bit switcheroo:

$ git init repo
Initialized empty Git repository in /tmp/repo/.git/
$ cd repo
$ echo 'very important info' >critical
$ git add critical
$ git commit -m critical
[master (root-commit) c4d6d90] critical
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 critical
$ git ls-tree HEAD
100644 blob 82d423c32c4bb2c52938088e0234db041bf4eaaf    critical
$ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
very important info
$ echo 'Very important info' | git hash-object --stdin -w
81a3797afe76d339db25c0f9c705a6caa47279c2
$ mv .git/objects/81/a3797afe76d339db25c0f9c705a6caa47279c2 \
     .git/objects/82/d423c32c4bb2c52938088e0234db041bf4eaaf

Of course, git-fsck notices

$ git fsck
error: sha1 mismatch 82d423c32c4bb2c52938088e0234db041bf4eaaf

error: 82d423c32c4bb2c52938088e0234db041bf4eaaf: object corrupt or missing
missing blob 82d423c32c4bb2c52938088e0234db041bf4eaaf

but git-log is happy with the change

$ git log -p
commit c4d6d90467af9ffa94772795d5c5d191228933c1
Author: Greg Bacon <gbacon@dbresearch.net>
Date:   Thu Apr 7 12:20:53 2011 -0500

    critical

diff --git a/critical b/critical
new file mode 100644
index 0000000..82d423c
--- /dev/null
+++ b/critical
@@ -0,0 +1 @@
+Very important info

as is git-checkout.

$ rm critical 
$ git checkout .
$ cat critical 
Very important info

A specific invocation of git-show reveals the corruption

$ git show 82d423c32c4bb2c52938088e0234db041bf4eaaf
error: sha1 mismatch 82d423c32c4bb2c52938088e0234db041bf4eaaf

fatal: bad object 82d423c32c4bb2c52938088e0234db041bf4eaaf

but not a broader one.

$ git show
commit c4d6d90467af9ffa94772795d5c5d191228933c1
Author: Greg Bacon <gbacon@dbresearch.net>
Date:   Thu Apr 7 12:20:53 2011 -0500

    critical

diff --git a/critical b/critical
new file mode 100644
index 0000000..82d423c
--- /dev/null
+++ b/critical
@@ -0,0 +1 @@
+Very important info

Even git-clone doesn't notice!

$ cd ..
$ git clone repo clone
Cloning into clone...
done.
$ cat clone/critical 
Very important info

What is the full list of specific git command modes (e.g., git show $sha1 should be present but not git show or git show HEAD) that perform integrity checks?

解决方案

In response to Mark Longair's answer, I fired up cscope and found:

(note how cscope has a curses interface and integrates nicely into Vim in case your interest was piqued)

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);

这篇关于哪些git命令执行完整性检查?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆