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

Невозможно использовать 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? Есть ли какие-либо дополнительные шаги, которые я могу предпринять, чтобы определить, что является основной проблемой?

4b9b3361

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