不能将 git add 与 --patch 选项一起使用

Posted

技术标签:

【中文标题】不能将 git add 与 --patch 选项一起使用【英文标题】:Can't use git add with --patch option 【发布时间】:2016-06-23 02:17:31 【问题描述】:

我最近将 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.

这仅发生在_ 目录中的文件,但无论我是否将cd 放入该目录以运行git add 命令而不必显式指定带有下划线的路径;还是不行:

PS C:\Users\Carl\www\dl\_\php> git add -p .\class.Menu.php
No changes.

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

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

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

【问题讨论】:

你是签出到提交还是分支? 不,这不是一个新文件。这是一个已经存在于存储库中的文件,我只是对其进行了更改。 您是否在一次提交上签出?以我的经验,这可能会导致奇怪的行为。 不,我不是。我只是在一个普通的分支上,一切都是最新的。 那么我必须同意@Walle 的回答,这不是很好,但应该可以。 【参考方案1】:

好吧,我能够重现这一点,并且似乎它是相同的 POSIX 到 Windows 路径转换。 ProcessMonitor 显示git(实际上,perlgit 运行)查找文件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 中设置环境变量,但这也应该可以。)

您不应该全局/永久启用MSYS_NO_PATHCONV(例如在 git bash 中使用 export 或在系统设置中修改 Windows 的用户/系统环境变量),因为这可能会导致不需要的效果,而且它可能会破坏比修复更多的东西(参见this SO comment)。实际上,git-windows 人 warn 甚至反对临时启用 MSYS_NO_PATHCONV话虽如此,我开始认为 OP 的问题是 git-for-windows 错误,应该这样报告(可能与 git-add 是二进制文件有关,但 git-add--interactive 是 perl 脚本)。

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

【讨论】:

在windows的cmd中设置环境变量:set MSYS_NO_PATHCONV=1 @StijndeWitt 或打开控制面板 > 系统 > 高级系统设置 > 环境变量,特别是如果您需要为所有用户设置某些内容,而不仅仅是当前用户。 @GalacticCowboy 请记住,在控制面板中对环境变量的更改直到重新启动后才会显示在其他地方。 @DanNeely 发生这种情况 (IIRC) 因为设置环境变量不会影响正在运行的进程,如果您通过资源管理器启动任何内容,它将继承资源管理器预先存在的环境。我认为您可以通过杀死资源管理器并重新启动它(或者在最坏的情况下,注销/登录)来解决这个问题 @CarlFink 在 PowerShell 中设置环境变量的语法与 bash 不同(我猜),因此出现错误。 POSIX 到 Windows 的路径转换在 PS 中仍然有效。【参考方案2】:

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

【讨论】:

当您使用制表符完成路径时,PowerShell 会自动添加 .\ 。但无论哪种方式,结果都是一样的——Git 报告说有no changes,但显然有。 git add -p,不指定文件名,什么都不做。它不产生任何输出,只是恢复提示。什么都没有上演。 @ChristianGrabowski,在 Git Bash 和 cmd.exe 中,结果相同:git add -p 不产生任何输出。 您确定文件正在被正确编辑和保存吗?就像在文件上运行差异一样。 @ChristianGrabowski 是的,文件确实发生了变化,当我运行 git diff 时它们会正确显示。

以上是关于不能将 git add 与 --patch 选项一起使用的主要内容,如果未能解决你的问题,请参考以下文章

不能将 `git mergetool` 与 `git am` 或 `git apply` 或 `patch` 一起使用

使用 git add --patch <filename> 手动编辑

[Git] Use git add --patch for better commit history and mitigating bugs

如何在 git add --patch 中使用 --color-words?

如何在 git add --patch 中使用 --color-words?

如何使用寻呼机进行长 git add --patch hunks?