不能使用git add with --patch选项

Car*_*ink 22 windows git filenames git-add

我最近更新了Git版本2.7.2.windows.1(我正在运行Windows 7 64位).自更新以来,我无法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
Run Code Online (Sandbox Code Playgroud)

我可以用简单的方法添加整个文件git add,或者通过名称指定文件.但是,如果我尝试包含-p--patch选项(两个变体产生相同的结果),Git报告没有变化:

PS C:\Users\Carl\www\dl> git add -p .\_\php\class.Menu.php
No changes.
Run Code Online (Sandbox Code Playgroud)

这只发生在_目录中的文件中,但无论我是否cd进入该目录运行git add命令而不必明确指定其中带有下划线的路径都无关紧要; 它仍然不起作用:

PS C:\Users\Carl\www\dl\_\php> git add -p .\class.Menu.php
No changes.
Run Code Online (Sandbox Code Playgroud)

我最初认为这个问题与我最近在目录中的文件中遇到的类似问题有关_,我在这里问过这个问题.但是,该问题似乎与MinGW中的Posix路径转换有关,而无论是使用Git Bash,Windows PowerShell还是cmd.exe都会出现此问题.

正如我在上一个问题中所说,我认为强调在文件/目录名称中有效.另外,我不是项目的所有者,因此我无法重命名目录或移动文件.

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

Rom*_*man 14

好吧,我能够重现这一点,似乎它是相同的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
Run Code Online (Sandbox Code Playgroud)

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

你不应该MSYS_NO_PATHCONV全局/永久地启用(例如export在git bash中使用或在系统设置中修改windows的用户/系统环境变量),因为这会导致不必要的影响,并且它可能会破坏比它修复的更多的东西(见这个评论).实际上,git-windows人员甚至警告不要临时启用MSYS_NO_PATHCONV.
话虽如此,我开始认为OP的问题是一个git-for-windows错误,应该这样报告(可能与git-add二进制事实有关,但是git-add--interactive是一个perl脚本).

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