Как работает git read-tree без опции -m или --reset - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь выяснить, как работает git read-tree, когда указано несколько деревьев, но опция -m или --reset отсутствует. Страница man описывает только поведение нескольких деревьев при объединении. Есть тестовый набор https://github.com/git/git/blob/master/t/t1008-read-tree-overlay.sh как часть набора тестов, который тестирует «дерево чтения с несколькими деревьями без слияния». Тестовый пример устанавливает три дерева, которые выглядят следующим образом:

начальная: 100644 blob 5626abf0f72e58d7a153368ba57db4c673c0e171 a

мастер: 100644 blob 5626abf0f72e58d7a153368ba57db4c673c0e171 a 100644 blob f719efd430d52bcfc8566a43b2eb655688d38871 b

сторона: 100644 blob 5626abf0f72e58d7a153368ba57db4c673c0e171 a 100644 blob 8510665149157c2bc901848c3e0b746954e9cbd9 b/c

Я ожидаю, что дерево трехстороннего чтения initial, master и side приведет к файлу стадии 0 a, стадии 2 b и стадии 3 b/c из-за конфликта между b и b/c (который фактически является результатом при запуске read-tree -m initial master side или read-tree --reset initial master side на этих деревьях), но при запуске без параметров это приводит к этапу 0 a, стадия 0 b/c и совсем не b. Почему между b и b/c нет конфликта, если опция -m отсутствует? Как b/c выигрывает у b (что происходит независимо от порядка деревьев в командной строке при запуске без -m)?

1 Ответ

0 голосов
/ 05 сентября 2018

Мне не ясно, какова цель такого дерева чтения, но причина, по которой у вас нет конфликта, состоит в том, что этот вид дерева чтения действительно объединяет три дерева без слияния ( так что все находится на нулевой стадии), и невозможно иметь файл и каталог с одинаковыми именами, поэтому запись каталога переопределяет запись файла, удаляя b из окончательного индекса.

Базовый код (в unpack-trees.c) также используется для git diff-index - см. этот комментарий в unpack_callback - и здесь он хочет знать, может ли он пропустить поддерево. Имеет ли это какое-то влияние на то, как случай без слияния предназначен для поведения , я не совсем уверен, но учтите, что когда мы дойдем до этого фрагмента кода, у нас есть маска и маска, которая делает не совпадает (так как у одного дерева есть каталог, а у двух других есть файлы). Функция unpack_nondirectories просто устанавливает stage = 0, если o->merge имеет значение false, что имеет место в данном случае. (Кажется, что он может вести себя иначе, если дерево last имеет каталог в этой позиции, так как здесь мы установим бит конфликта, тогда continue.)

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