git apply выдает ошибку, не соответствует индексу, когда предыдущее применение пропускает фрагменты

git версия 2.19.0

У меня есть два коммита для файла myfile, который я выбираю из одной ветки в другую. Во время применения последнего патча я получаю сообщение «ошибка: mydir / myfile: не соответствует индексу».

1) Я создаю два файла патча commit1.patch (самый старый) и commit2.patch (самый новый):

cd /target-branch  
git --git-dir=/source-branch/myrepo/.git format-patch -k -1 <commit N's ID>  

2) Применяю патч №1:

git apply -3 commit1.patch  
error: patch failed: mydir/myfile:17  
error: repository lacks the necessary blob to fall back on 3-way merge.
error: mydir/myfile: patch does not apply  

... который терпит неудачу, как и ожидалось, потому что два фрагмента в патче изменяют блоки кода, добавленные в коммите более раннем, чем коммит №1. Я не применяю эту старую фиксацию, потому что это исправление, которое мне не нужно в целевой ветке.

3) Я повторно применяю патч 1, используя --reject вместо -3, чтобы пропустить применение двух неприменимых фрагментов:

git apply --reject 1.patch

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

4) Применяю патч №2:

git apply -3 commit2.patch
error: mydir/myfile: does not match index

Почему ошибка «не соответствует индексу»? 'git status' показывает, что промежуточная стадия пуста, 'git fsck' не сообщает об ошибках, 'git diff --cached' ничего не сообщает.

Я нашел обходной путь: свежий клонируйте целевую ветку, удалите два фрагмента, которые нельзя применить из commit1.patch, а затем выполните:

git apply -3 commit1.patch
git apply -3 commit2.patch

… Который работает без ошибок

Как я могу устранить ошибку «не соответствует индексу» на выходе commit2.patch, кроме как сначала вручную удалить два фрагмента из commit1.patch?


person jimvfr    schedule 16.02.2019    source источник


Ответы (1)


Ответ на ваш вопрос находится в git apply документации, но в нескольких частях, к которым Я добавил жирный шрифт (варианты уже были выделены жирным шрифтом):

-3, --3way
Когда патч не применяется правильно, используйте трехстороннее слияние, если патч записывает идентификационные данные blob-объектов, к которым он должен применяться, а они у нас есть BLOB-объекты доступны локально, возможно, оставляя маркеры конфликтов в файлах в рабочем дереве, чтобы пользователь мог их разрешить. Этот параметр подразумевает параметр --index и несовместим с параметрами --reject и --cached.

Отсюда вы должны немного отступить:

--index
Когда действует --check или применяется исправление (которое используется по умолчанию, когда ни один из параметров, отключающих его, не действует), убедитесь, что исправление применимо к тому, что записи текущего индексного файла. Если файл, который необходимо исправить, в рабочем дереве устарел, он помечается как ошибка. Этот флаг также вызывает обновление индексного файла.

Таким образом, используя -3, вы включили --index, а --index явно вызывает ошибку, если копия файла в рабочем дереве не совпадает с индексной копией файла.

Ранее, на шаге 3, вы вручную запускали git apply --reject, без -3 или --index. Это не дает сбой при создании файла .rej, но делает разные копии индекса и рабочего дерева.

Если нет смысла использовать -3, просто оставьте его в обоих случаях, чтобы вы применили без обновления индексной копии файла и без ограничения копии рабочего дерева файла на match индексной копии файла тоже нет.

person torek    schedule 16.02.2019
comment
Спасибо! Воспользовавшись вашим советом, я начал чистить и выполнил git apply --reject commit1.patch, затем git apply commit2.patch. Завершился без ошибок и пропустил два фрагмента в патче 1, как и ожидалось. - person jimvfr; 17.02.2019