Подтвердить что ты не робот

Git -apply не таинственно, как мне устранить/исправить?

В настоящее время я пытаюсь выполнить проверку кода в PR-репозитории (github), и я хочу доставить исправления для отправителей, с помощью которых они могут легко исправить codestyle. С этой целью я снимаю свой PR, запускаю наш uncrustify script поверх него, чтобы исправить любые ошибки стиля, и хочу создать файл .patch, который они могут легко применить. Однако он последовательно разбивается на некоторые файлы.

Я делаю (git версия 1.7.10.4 с core.autocrlf=input, core.filemode=false):

$ git checkout pr-branch
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean)
$ <run the code styler script, which modifies some files>
$ git diff > ../style.patch (so the patch file lands outside the repo)
$ git reset --hard HEAD (to simulate the situation at the submitter end)
$ git log -1 (shows: commit dbb8d3f)
$ git status (nothing to commit, working directory clean, so we are where we started)
$ git apply ../style.patch
error: patch failed: somefile.cpp:195
error: somefile.cpp: patch does not apply (same output using the --check option)

Это относится только к некоторым файлам, а не ко всем. Я не знаю, как устранить эту проблему, т.е. Как получить git, чтобы сказать мне, где именно он идет не так - он только говорит мне hunk #, когда я копаю, но это все еще довольно огромно.

То, что я пробовал до сих пор (без успеха):

  • apply --reverse, apply --whitespace=nowarn
  • diff HEAD вместо diff
  • сделать фиктивный фиксатор (совершать работы без проблем!), использовать format-patch, удалить фиктивную фиксацию, применить патч с помощью git-am с помощью или без -3 или применить с помощью git-apply
  • Примените файл патча в локальном каталоге вместо одного вверх (захват соломы здесь)
  • Проверьте man-страницы git -diff, -apply, -format-patch, -am для чего-нибудь полезного
  • с командой linux patch
  • ....

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

Как я могу исправить/диагностировать это или даже узнать, где именно это происходит? Помогло бы мне, если бы я опубликовал разницу между одним из виновных файлов? Что меня озадачивает, так это то, что коммит работает без проблем, но патч, созданный с помощью фиксации, не работает?

После борьбы с этим в течение нескольких часов я в конце своих знаний...

4b9b3361

Ответ 1

Обновление:

Вы можете использовать git apply -v, чтобы просмотреть более подробную информацию о том, что происходит, git apply --check, чтобы просто проверить операцию, или git apply --index, чтобы перестроить локальный файл индекса.

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

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

------

Скорее всего, нет ничего плохого в различии. Вместо этого посмотрите на целевой репозиторий git. Пока вы делаете git reset --hard HEAD, ничто не гарантирует, что HEAD в этом другом репозитории совпадает с HEAD на вашем.

Сделайте git log в целевом репо и посмотрите на фиксацию вверху. Это то же самое, что и тот, с которым вы столкнулись? Скорее всего, это не так. Посмотрите историю и проверьте, есть ли требуемая фиксация. Если это так, то целевое репо опережает вас, и вам нужно вернуться назад, сделать git pull (или git rebase) и создать новый diff. Если это не так, то целевое репо находится за вашим, и вам нужно сделать git pull (или git rebase) в целевом репо, чтобы довести его до скорости.

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

Ответ 2

Попробуйте проверить файл исправления - пример:

git apply --reject mypatch.patch

это покажет вам различия, если таковые имеются - вот пример того, как это могло бы выглядеть:

error: patch failed: <filename>:<linenumber>
error: while searching for :
    cout << "}" << endl; // example of a line in your patch