我最近更新Git 2.7.2.windows.1
(我正在运行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.
这只发生在_
目录中的文件,但不pipe是否进入该目录运行git add
命令,而不必明确指定一个具有下划线的path; 它仍然不起作用:
PS C:\Users\Carl\www\dl\_\php> git add -p .\class.Menu.php No changes.
我最初以为这个问题和我最近在_
目录下遇到的一个类似的问题有关系,我在这里询问了这个问题 。 但是,该问题似乎与MinGW中的Posixpath转换相关,而无论使用Git Bash,Windows PowerShell还是cmd.exe,都会出现此问题。
正如我在前面的问题中所说的,我认为下划线在文件/目录名称中是有效的。 此外,我不是项目的所有者,所以我不能重命名目录或移动文件。
这是Git中的错误吗? 是否有任何额外的步骤可以确定潜在的问题是什么?
那么,我能够重现这一点,似乎它是相同的POSIX到Windows路径转换。 ProcessMonitor显示git
(实际上, perl
由git
运行)查找文件C:\Program Files\Git\php\class.Menu.php
。
为了解决这个问题(至少这对我MSYS_NO_PATHCONV
),根据文档 ,你可以暂时设置环境变量MSYS_NO_PATHCONV
,像这样(在git bash中):
MSYS_NO_PATHCONV=1 git add -p _/php/class.Menu.php
(我不知道如何在Windows的cmd / powershell中设置env变量,但这也应该是可能的。)
你不应该全局/永久地启用MSYS_NO_PATHCONV
(例如在git bash中使用export
或者在系统设置中修改windows的用户/系统环境变量),因为这可能会导致不必要的效果,而且它可能会打破更多的东西,会修复(见这个评论 )。 其实,git-windows人们甚至会临时启用MSYS_NO_PATHCONV
。
话虽如此,我开始认为,OP的问题是一个git-for-windows的bug,应该这样报道(可能与git-add
是一个二进制的事实有关,但是git-add--interactive
是一个perl脚本)。
另一个列出的解决方法是将第一个斜线加倍,如git add -p _//php/class.Menu.php
(或者是否意味着该参数必须以双斜线开头?),但这似乎不起作用复杂的中间路径转换,这发生在调用git add
和真正的文件访问之间。
我会尝试没有.
。 另外我从来没有通过一个文件名git add -p
。 我只是做我的改变,并按原样运行。 我也会检查,确保你所做的任何更改实际上都被应用到特定的文件,并且文件正在被触摸。