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. Пробельные вещи должны только предупреждать, не так ли? В любом случае, я не буду игнорировать их, поскольку это исправление стиля, которое, очевидно, включает пробелы.
Как я могу исправить/диагностировать это или даже узнать, где именно это происходит? Помогло бы мне, если бы я опубликовал разницу между одним из виновных файлов? Что меня озадачивает, так это то, что коммит работает без проблем, но патч, созданный с помощью фиксации, не работает?
После борьбы с этим в течение нескольких часов я в конце своих знаний...
Ответы
Ответ 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