git add --interactive " ваш отредактированный кусок не применяется"



Я пытаюсь использовать git add --interactive чтобы выборочно добавить некоторые изменения в мой индекс, но я постоянно получаю "ваш отредактированный кусок не применяется. Отредактируйте еще раз..." сообщение. Я получаю это сообщение, даже если я выбираю опцию e, и сразу же сохраняю/закрываю свой редактор. Другими словами, без редактирования ломоть вообще, патч не применяется.

вот точный пример, который я использую (я пытаюсь собрать небольшую демонстрацию):

исходный файл:

first change
second change off branch
third change off branch
second change
third change
fourth change

новый файл:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

Я пытаюсь показать, как использовать git add --interactive чтобы добавить в индекс только строку "исправление ошибок 1". Запустив интерактивное добавление в файл, я выбираю режим исправления. Он дарит мне

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

я отвечаю расколом, а затем "нет", чтобы применить первый кусок. Второй ломоть, я пытаюсь отредактировать. Сначала я попытался удалить нижнюю строку-это не сработало. Оставить кусок в покое полностью тоже не работает, и я не могу понять, почему.

136   10  

10 ответов:

для этого конкретного примера вам нужно настроить номера строк в куске. Измените строку:

@@ -1,6 +2,8 @@

Так что вместо этого он читает:

@@ -2,7 +2,8 @@

это как в это git-добавить пост?

ручное редактирование ломоть очень мощный, но и немного сложнее, если вы никогда не делали этого раньше.
самое главное, чтобы иметь в виду: разница всегда отступ с одним символом в дополнение к любой другой отступ есть.
Персонаж может быть:

  • пробел (указывает на неизмененную строку),
  • a - указывает, что строка была удалена,
  • или + указывает, что строка была добавлена.

ничего другого. Это должно быть либо Пробел, А - или а +. Все остальное, и вы получите ошибки
(для измененной строки нет символа, так как они обрабатываются путем удаления старой строки и добавления измененной как новой).

Так как у вас есть diff открыт в вашем любимом текстовом редакторе (вы настроили Git чтобы использовать ваш любимый текстовый редактор, не так ли?), вы можете делать все, что хотите - до тех пор, пока вы убедитесь, что полученный diff применяется чисто.

и в этом весь фокус. Если вы никогда не делали этого раньше, Git скажет вам: "ваш отредактированный кусок не применяется. Снова редактировать?- так часто ты начинаешь ненавидеть себя за свою неспособность понять это, хотя это кажется так легко (или Git, потому что он не может понять, что вы хотите).

одно дело, что споткнулся я довольно часто было то, что я забыл один символ отступа.
Я бы отметил строку с A-для удаления, но в большинстве текстовых редакторов, которые вставляют a -, Он не перезаписывает пространство, которое было раньше. это означает, что вы добавляете дополнительное пространство ко всей строке, что в свою очередь означает, что алгоритм diff не может найти/сопоставить строку в исходном файле, что в свою очередь означает, что Git будет кричать на вас.

другое дело, что diff все еще имеет иметь смысл. "Смысл" означает, что его можно применять чисто. Именно то, как вы создаете разумный diff, кажется немного темным искусством (по крайней мере, для меня сейчас), но вы всегда должны помнить, как выглядел исходный файл, а затем планировать свои-s и +S соответственно. Если вы будете редактировать свои куски достаточно часто, вы в конечном итоге получите повесить его.

см. также фиксация на git add-p.

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

эта конкретная проблема связана с расщеплением и попытка редактировать тот же кусок. Анализ, как первоначально опубликовал Джефф Кинг, основной проблемы по существу является:

тю. Хорошо, я вижу. Проверка "применяется ли это различие" кормит и части разделенный патч для git-apply. Но конечно вторая часть никогда не будет правильно применить, потому что его контекст перекрывается с первой частью, но не принимает это во внимание.

проверка с помощью просто отредактированный патч будет работать. Но что не принимает во внимание, что ваш отредактированный патч потенциально потерпит неудачу применять в долгосрочной перспективе, в зависимости от того, принимаете ли вы в другая половина раскола патча. И мы пока не могу этого знать, потому что пользователь, возможно, не сказал нам (они могли пропустить первую половину, и затем вернитесь к нему позже после шага редактирования).

Джефф завершает свой пост с очень прагматичным обходным путем, который всегда преуспевает, и поэтому настоятельно рекомендуется:

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

только выбрав для редактирования кусок не ранее сплит, вам не придется иметь дело с номерами строк.

Если вы не хотите удалять строку, которая была создана для удаления, как в

 first line
-second line
 third line

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

недавно я понял из чтения этой темы, как работать с ручным редактированием.

трюк, который я использовал, состоял в том, что если у меня есть такая разница.

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

трюк состоит в том, чтобы удалить две строки, которые я не хочу полностью сделать результирующий diff похожим на это.

+ Line to add
+ Line to add

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

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

Я пришел к этому вопросу, ища решение той же проблемы, и не мог понять, как изменить номера строк (как предлагалось выше) в куске, чтобы получить git принять его в моем случае. Я нашел гораздо лучший способ сделать это с помощью git gui хотя. Там вы можете выбрать строки в diff, которые вы хотите разместить, затем щелкните правой кнопкой мыши и выберите "Stage lines from commit". Я помню ГИТ-Кола имеет такую же функциональность.

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

я использовал Windows и использовал блокнот для моих правок (только сохраняет с окончаниями строк Windows). Мой код был написан с помощью Notepad++, и я настроил его на конец строки в стиле Unix/Linux.

когда я изменил свои настройки, чтобы иметь Notepad++ в качестве редактора git по умолчанию, я смог внести свои изменения в hunk.

git config --global core.editor "notepad++"

важно также правильно изменить заголовок ломоть (например,@@ -1,6 +1,9 @@). Хоакин Windmuller раскрыть секрет редактирования заголовка ломоть в одном из его блоге.

секреты редактирования кусков

редактирование кусков может быть запутанным сначала, инструкции, которые git дает вам помощь, но не достаточно, чтобы начать работу.

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

секрет соуса ... подсчет строк:

  • если вы удалите строку, которая начинается с+, то вычтите один до Нового количества строк (последняя цифра заголовка ломоть).
  • если вы удалите строку, которая начинается с - то добавить один в новый счетчик строк (последняя цифра заголовка ломоть).
  • не удаляйте другие линии (линии отсчета).

Это должно позволить вам быстро изменить куски, чтобы выбрать части вы хотите.

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

    Ничего не найдено.

Добавить ответ:
Отменить.