Невозможно использовать git add с опцией --patch
Недавно я обновил Git до версии 2.7.2.windows.1
(я запускаю 64-разрядную версию Windows 7). С момента обновления я не смог запустить git add
с опцией -p
для файлов в определенном каталоге (или его подкаталогах), чье имя _
(подчеркивание).
git status
правильно сообщает, что мой файл имеет изменения:
PS C:\Users\Carl\www\dl> git status
On branch develop
Your branch is up-to-date with 'origin/develop'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: _/php/class.Menu.php
И я могу добавить весь файл с помощью простого git add
, или указав файл по имени. Но если я попытаюсь включить параметр -p
или --patch
(оба варианта дают одинаковые результаты), Git сообщает, что изменений нет:
PS C:\Users\Carl\www\dl> git add -p .\_\php\class.Menu.php
No changes.
Это происходит только для файлов в каталоге _
, но неважно, будет ли я cd
в этот каталог запускать команду git add
без явного указания пути с подчеркиванием в нем; он по-прежнему не работает:
PS C:\Users\Carl\www\dl\_\php> git add -p .\class.Menu.php
No changes.
Первоначально я думал, что эта проблема связана с аналогичной проблемой, с которой я столкнулся недавно в файлах в каталоге _
, о котором я спросил здесь. Однако эта проблема связана с преобразованием пути Posix в MinGW, тогда как эта проблема возникает, если я использую Git Bash, Windows PowerShell или cmd.exe.
Как я уже говорил в предыдущем вопросе, я считаю, что подчеркивания будут действительными в именах файлов/каталогов. Кроме того, я не являюсь владельцем проекта, поэтому я не могу переименовать каталог или переместить файл.
Является ли это ошибкой в Git? Есть ли какие-либо дополнительные шаги, которые я могу предпринять, чтобы определить, что является основной проблемой?
Ответы
Ответ 1
Ну, я смог воспроизвести это и, похоже, это одно и то же преобразование пути POSIX к Windows. ProcessMonitor показывает, что git
(фактически, perl
, выполняемый git
) ищет файл C:\Program Files\Git\php\class.Menu.php
.
Чтобы работать над этим (по крайней мере, это сработало для меня), согласно документации, вы можете установить переменную окружения MSYS_NO_PATHCONV
временно (например, git bash):
MSYS_NO_PATHCONV=1 git add -p _/php/class.Menu.php
(Я не знаю, как устанавливать переменные env в windows 'cmd/powershell, но это тоже должно быть возможно.)
Вы не должны включать MSYS_NO_PATHCONV
глобально/постоянно (например, используя export
в git bash или изменяя переменные пользователя/системной среды Windows в системных настройках), поскольку это может привести к нежелательным эффектам и это, вероятно, сломает намного больше вещей, чем это исправит (см. этот комментарий SO). Фактически, git -windows folks предупреждать против даже временного включения MSYS_NO_PATHCONV
.
Сказав это, я начинаю думать, что проблема с OP является ошибкой git -for-windows и должна сообщаться как таковая (возможно, это связано с тем, что git-add
является двоичным, но git-add--interactive
является perl script).
Другим перечисленным обходным решением является удвоение первой косой черты, например git add -p _//php/class.Menu.php
(или это означает, что параметр должен начинаться с двойной косой черты?), но это, похоже, не работает из-за сложных промежуточных конверсий пути, которые происходят между вызовом git add
и реальным доступом к файлам.
Ответ 2
Я бы попробовал без этого .
. Также я никогда не передавал имя файла git add -p
. Я просто делаю свои изменения и запускаю это как есть. Я также хотел бы убедиться, что любые изменения, которые вы делаете, фактически применяются к этому конкретному файлу, и файл затрагивается.