Как Git узнает, какой индексный объект добавить в дерево? - PullRequest
0 голосов
/ 27 апреля 2010

РЕДАКТИРОВАТЬ: Если вы отрицаете мой вопрос, есть порядочность, чтобы сказать, почему.

В Pro Git Ch9 автор говорит:

Git обычно создает дерево, беря состояние вашей промежуточной области или индекса и записывая из него объект дерева.

Мой вопрос: как git узнает , что из двух последовательных записей индекса, из которых создается объект Tree?

Например (случайные числа означают 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-объектом - никто не ссылается на него. Это просто разрушено или забыто?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010
  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 gc" удалит (удалит) незакрепленный висящий объект .git/objects/1f/755a7fffe4... (только из-за некоторой задержки по соображениям безопасности).

1 голос
/ 27 апреля 2010

git создает дерево коммитов из файла .git/index, индекс хранит текущее дерево и всю связанную информацию. то, что вы видите в .git/objects/…, являются фактическими объектами BLOB-объектов вашего файла one.txt, а не индексными объектами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...