2010-04-27 109 views
-1

编辑:如果你downvote我的问题有一个体面的说为什么。Git如何知道将哪个索引blob添加到树中?

Pro Git Ch9的作者说:

通常Git根据你的暂存区域或索引的状态,并从它上面书写树对象创建树。

我的问题是如何混帐知道两个consequitive索引条目从创建树对象?

例如(随机数的意思是40字符SHA1的 - 我只是做举起手来):

$ echo 'First change' > one.txt 
$ git add one.txt 
$ find .git/objects -type f 
.git/objects/1f/755a7fffe4 //first index entry 

$ echo 'Second change' > one.txt 
$ git add one.txt 
$ find .git/objects -type f 
.git/objects/2d/234asdf2 //second index entry 

$ git commit -a -m "Initial commit" 
$ git cat-file master^{tree} 
100644 blob 2d234asdf2 one.txt //How did it know not to take 1f755?? 

是否只看BLOB时间戳? 另外 - 创建第一个blob会发生什么 - 没有人引用它。它会被摧毁还是被遗忘?

+1

你的git有一些非常错误的地方。首先,你在blob上添加'one.txt'和你的对象数据库增益,然后添加(可能已经存在的)'two.txt',并且你的对象数据库中只有一个blob,它会丢失对应于'one .txt'。此外,您的blob条目没有正确的ID。你使用的是什么版本的git? – 2010-04-27 14:36:16

+0

“git add two.txt”你的意思是“one.txt”? – Thilo 2010-04-27 14:39:24

+0

@Thilo:Yah我的意思是one.txt改变了它。对不起@Charles - 错字。忽略我制作的ID :-) – drozzy 2010-04-27 16:12:22

回答

2
  1.  
    $ echo 'First change' > one.txt 
    $ git add one.txt 
    $ find .git/objects -type f 
    .git/objects/1f/755a7fffe4... # first index entry (repository database) 
    $ git ls-files --cached --stage --exclude-standard one.txt 
    100644 1f755a7fffe4... 0  one.txt # in 'the index' 
    
  2.  
    $ echo 'Second change' > one.txt 
    $ git add one.txt 
    $ find .git/objects -type f 
    .git/objects/2d/234asdf2...  # second index entry (repository database) 
    $ git ls-files --cached --stage --exclude-standard one.txt 
    100644 2d234asdf2... 0  one.txt  # in 'the index' 
    
  3.  
    $ git commit -a -m "Initial commit" 
    $ git cat-file -p master^{tree} 
    100644 blob 2d234asdf2... one.txt # the one from 'the index' 
    
  4. “混帐气相色谱法” 将修剪(删除)宽松的悬空对象.git/objects/1f/755a7fffe4... (仅在出于安全原因延迟之后)。

+0

因此,它只保留最后一个“添加”blob索引? – drozzy 2010-04-27 18:35:45

+0

@drozzy:索引引用LAST“added”blob,git-commit提取索引描述的状态。 – 2010-04-27 23:04:23

+0

有没有证据呢? :-)最后你的意思是 - 按时间顺序排列最后?如果我将时钟倒退...... – drozzy 2010-04-27 23:24:37

1

git从文件.git/index创建提交树,索引存储当前树和所有相关信息。您在.git/objects/…看到的是你的文件one.txt的实际BLOB对象的,而不是索引对象

+0

是的,我知道。但是,它如何知道不是第一次使用SECOND?是否有指向索引中最新的blob的指针? 我的意思是当你添加文件时没有创建TREE对象。 – drozzy 2010-04-27 18:34:40

相关问题