不能使用 git 添加 --patch 选项

Can't use git add with --patch option

我最近将 Git 更新到版本 2.7.2.windows.1(我是 运行ning Windows 7 64 位)。自更新以来,我一直无法对名称为 _(下划线)的某个目录(或其子目录)中的文件使用 -p 选项 运行 git add .

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.

我最初认为这个问题与我最近在 _ 目录 中遇到的一个类似问题有关。但是,该问题似乎与 MinGW 中的 Posix 路径转换有关,而无论我使用 Git Bash、Windows PowerShell 还是 cmd.exe.

正如我在上一个问题中所说,我认为下划线在 file/directory 名称中有效。此外,我不是该项目的所有者,因此无法重命名目录或移动文件。

这是 Git 中的错误吗?我可以采取任何其他步骤来确定根本问题是什么吗?

没有那个我会尝试 .。此外,我从未将文件名传递给 git add -p。我只是进行更改,运行 保持原样。我还会检查以确保您所做的任何更改实际上都应用于该特定文件,并且该文件正在被触及。

好吧,我能够重现这个,看起来它是相同的 POSIX-to-Windows 路径转换。 ProcessMonitor 显示 git(实际上,perl 运行 by git)查找文件 C:\Program Files\Git\php\class.Menu.php.

根据 documentation,要解决这个问题(至少对我有用),您可以临时设置环境变量 MSYS_NO_PATHCONV,就像这样(在 git bash):

MSYS_NO_PATHCONV=1 git add -p _/php/class.Menu.php

(我不知道如何在 windows' cmd/powershell 中设置 env 变量,但这应该也是可能的。)

您不应启用 MSYS_NO_PATHCONV globally/permanently(例如,在 git bash 中使用 export 或在系统设置中修改 windows' user/system 环境变量),因为这会导致不必要的影响,而且它可能会破坏比修复更多的东西(参见 this SO comment). Actually, git-windows folks warn 反对甚至临时启用 MSYS_NO_PATHCONV.
话虽如此,我开始认为 OP 的问题是 git-for-windows 错误,应该这样报告(可能与以下事实有关git-add 是二进制文件,但 git-add--interactive 是 perl 脚本)。

另一个列出的解决方法是将第一个斜杠加倍,例如 git add -p _//php/class.Menu.php(或者这是否意味着参数必须以双斜杠开头?),但由于中间路径复杂,这似乎不起作用转换,发生在调用 git add 和实际文件访问之间。