"git apply" выдает ошибку "не совпадает с индексом", когда предыдущая команда пропускает блоки - PullRequest
0 голосов
/ 16 февраля 2019

git version 2.19.0

У меня есть два коммита для файла 'myfile'. Я выбираю вишню из одной ветви в другую.Во время применения последнего патча я получаю сообщение «error: 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?

1 Ответ

0 голосов
/ 16 февраля 2019

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

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

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

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

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

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

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

...