致命:git 的构建不支持 git-add--interactive (NO_PERL=1)

2023-12-02

当我执行“git add -i”时,它会弹出此错误:

致命:git 的构建不支持 git-add--interactive (NO_PERL=1)

我迫切需要帮助!


使用 Git 2.25(2020 年第一季度,五年后),Perl 不应再成为git add.
Here, "git add -i" 正在用 C 重写。

警告,自 Git 2.37(2022 年第 2 季度)以来,C 重写是默认的.
请参阅此答案的末尾。

See commit 8c15904, commit 3d965c7 (15 Nov 2019), and commit 1daaebc (13 Nov 2019) by Slavica Đukić (slavicaDj).
See commit 68db1cb, commit 76b7432, commit 6348bfb (15 Nov 2019), and commit f83dff6 (13 Nov 2019) by Johannes Schindelin (dscho).
See commit 5e82b9e, commit e4cb659 (13 Nov 2019) by Daniel Ferreira (theiostream).
(Merged by Junio C Hamano -- gitster -- in commit f7998d9, 05 Dec 2019)

built-in add -i: 实施help command

Signed-off-by: Slavica Đukić
Signed-off-by: Johannes Schindelin

这模仿了显示 Perl 脚本中的帮助文本的代码git-add--interactive.perl在内置版本中。

And:

built-in add -i:显示命令的唯一前缀

Original-patch-by: Slavica Đukić
Helped-by: SZEDER Gábor
Signed-off-by: Johannes Schindelin

就像 Perl 脚本中一样git-add--interactive.perl,对于每个命令都有一个唯一的prefix确定(如果给定参数中存在任何参数),并显示在列表中,并接受作为命令的快捷方式。

为了确定唯一的前缀以及查找相关命令,我们使用列表的副本并对其进行排序。

虽然这对于单个命令来说似乎有点大材小用,但当所有命令都实现时,并且当我们重用相同的逻辑来提供要编辑的文件列表并使用方便的唯一前缀时,它会更有意义。

在这个补丁系列的开发之初,引入了一种模仿 Perl 版本实现的 Trie 的专用数据结构。然而,这被认为是多余的,我们现在只需对列表进行排序,然后通过查看每个项目的邻居来确定唯一前缀的长度。作为奖励,我们现在使用相同的排序列表来使用用户提供的前缀作为搜索键来执行二分搜索。

add-interactive.c解释:

“前缀项目列表”是由字符串标识的项目的列表,并且为每个项目确定唯一的前缀(如果有)。

一开始:

git add -i:开始实现内置版本git add --interactive

Signed-off-by: Johannes Schindelin

与之前的 C 转换不同,我们从内置助手开始,我们通过在run_add_interactive()新选择加入时的功能add.interactive.useBuiltin配置旋钮已打开(或相应的环境变量GIT_TEST_ADD_I_USE_BUILTIN),并调用新的内部API函数run_add_i()直接实现在libgit.a.

整个转换过程可以在 PR 中找到#170-175 at github.com/gitgitgadget/git.

The "--helper不幸的是,这里不能使用“方法”:在 Windows 上,我们面临一个非常具体的问题,即system()Perl 中的调用似乎已关闭stdin在父进程中,当生成的进程消耗甚至一个字符时stdin。这阻止我们在 C 中实现主循环并仍然尝试将其交给 Perl 脚本。

我们在这里必须采取的方法的真正缺点是测试套件不会通过GIT_TEST_ADD_I_USE_BUILTIN=true直到转换完成(--helper即使在每个增量转换步骤中,方法也会让它通过)。


注意:使用 Git 2.25,您可以看到错误消息(报告在git-for-windows/git第 2466 期):

BUG: pathspec.c:555: PATHSPEC_PREFER_CWD requires arguments

这应该在 Git 2.25.2(2020 年 3 月)中修复。

See commit 849e43c, commit d660a30 (16 Jan 2020) by Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit f094074, 30 Jan 2020)

built-in add -i:再次接受开放式范围

Signed-off-by: Johannes Schindelin

互动式add命令允许通过唯一的前缀、索引或索引范围为其某些子命令选择多个文件。

重新实施时git add -i在 C 中,我们甚至添加了一个代码注释,讨论缺少结束索引的范围,例如2-,但代码实际上并没有接受这些,正如 a 中指出的那样git-for-windows/git 问题 2466 的评论 by qhill.

顺便说一下重写git add --interactive in C破坏了使用开放范围选择文件的能力,例如Patch update>> 2-选择除第一个文件之外的所有文件。
这与此问题相关,因为尝试此操作会导致与此问题相同的行为(即 2.24.1.windows.2 中的 BUG 和 2.25.0.windows.1 中的立即退出)。

让我们解决这个问题,并添加一个测试用例来验证这个问题是否永远保持不变。


使用 Git 2.26(2020 年第一季度),努力移动“git-add--interactive“到C继续。

See commit c480eeb, commit cee6cb7, commit 52628f9, commit 6610e46, commit 90a6bb9, commit 36bae1d, commit d2a233c (21 Dec 2019) by Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit 9a5315e, 05 Feb 2020)

内置add -p:准备“stage”以外的补丁模式

Signed-off-by: Johannes Schindelin

Perl 脚本支持git add -p不仅用于该命令,还用于git stash -p, git reset -p and git checkout -p.

为C语言版本的教学做准备git add -p为了也支持后面的命令,让我们将特定于“阶段”的内容抽象为描述补丁模式之间差异的专用数据结构。

最后,请注意 Perl 版本尝试确保仅为修改后的文件生成差异。 这实际上并不是必需的,因为对 Git 的 diff 机制的调用已经执行了该工作,并且执行得很好。这使得无需移植FILTER领域的%patch_modes结构体,以及get_diff_reference()功能。


Git 2.37 附带git add -i默认情况下在 C 中.

如果您有任何问题,例如msys2/MSYS2-packages问题 3066,尝试解决方法git config --global add.interactive.useBuiltin=false.

That particular issue should be resolved with Git 2.37.1 (Q3 2022): rewrite of "git add -i"(man) in C that appeared in Git 2.25 did not correctly record a removed file to the index, which was fixed.

See commit 4788e8b (28 Jun 2022) by Johannes Schindelin (dscho).
(Merged by Junio C Hamano -- gitster -- in commit 0f0bc21, 02 Jul 2022)

add --interactive: allow update暂存已删除的文件

Reported-by: Christoph Reiter
Signed-off-by: Johannes Schindelin

The scripted version of git add -i(man) used git update-index --add --remove``(man), but the built-in version implemented only the --add part.

这修复了https://github.com/msys2/MSYS2-packages/issues/3066

问题是,在使用添加交互时:

git add -i
fatal: unable to stat 'myfile': No such file or directory

的后果add.interactive.useBuiltin:

With Git 2.38 (Q3 2022), fix deadlocks between main Git process and subprocess spawned via the pipe_command() API, that can kill "git add -p"(man) that was reimplemented in C recently.

See commit 716c1f6, commit c6d3cce, commit 14eab81, commit ec4f39b, commit 10f7433 (17 Aug 2022) by Jeff King (peff).
See commit 24b56ae (17 Aug 2022) by René Scharfe (rscharfe).
(Merged by Junio C Hamano -- gitster -- in commit a103ad6, 25 Aug 2022)

pipe_command():将标准输入描述符标记为非阻塞

Signed-off-by: Jeff King

Our pipe_command()helper 允许您在子进程的 stdin/stdout 上写入和读取。
它应该可以无死锁地工作,因为我们使用poll()检查描述符何时准备好读取或写入。

但有一个错误:如果要写入的数据和要读回的数据都超过管道缓冲区,我们就会死锁。

问题是代码假设如果您有一个 2MB 的缓冲区要写入并且poll()告诉您管道描述符已准备好写入,调用:

write(cmd->in, buf, 2*1024*1024);

将进行部分写入,填充管道缓冲区,然后返回它所写入的内容。
这就是它在套接字上执行的操作,但不适用于管道。
当写入管道时,至少在 Linux 上,它将阻塞等待子进程read() more.
现在我们有一个潜在的僵局,因为孩子可能正在给我们回信,等待我们read()我们自己。

触发此操作的一个简单方法是:

git -c add.interactive.useBuiltin=true \
    -c interactive.diffFilter=cat \
    checkout -p HEAD~200

与 HEAD~200 的差异将会很大,并且过滤器想要将所有内容写回给我们(显然这是一个虚拟过滤器,但在现实世界中,像 diff-highlight 这样的东西同样会流回一个大输出)。

如果你设置add.interactive.useBuiltin为 false,问题就消失了,因为现在我们不使用pipe_command()不再了(相反,这部分发生在 Perl 中)。
但这根本不是交互式代码中的错误。
这是底层pipe_command()代码已经被破坏,并且一直存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

致命:git 的构建不支持 git-add--interactive (NO_PERL=1) 的相关文章

  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • GitPython 检查 git pull 是否更改了本地文件

    使用 GitPython 我只想在拉取后本地文件发生更改时才调用函数 例如 如果我在一台单独的计算机上进行推送 然后拉第一台计算机 它按预期工作 但不提供任何输出 理想的输出是已更改的文件列表 或者只是告诉我拉动是否有错误 没有拉动 因为分
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • VS Code 在交互式变基期间不会等待我 [重复]

    这个问题在这里已经有答案了 如果我使用交互式变基git rebase i使用为 Git 配置的默认编辑器 一切都运行良好 如果我在我的全局中添加以下内容 gitconfig core editor C Program Files x86 M
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 如何在源代码管理中存储 Visual Studio 的调试配置

    Visual Studio 的调试配置存储在 user文件是用户特定的并且传统上被源代码管理忽略 我对工作目录参数感兴趣 我需要它在程序员的机器上保持一致 并且它具有以下价值 outDir而不是默认的 ProjectDir 我怎样才能解决这
  • 为什么 Git Bash 无法运行我的可执行文件?

    I am on git for windows https github com git for windows 吉特 巴什 我无法在命令行上运行可执行文件 Pedr Abc 07 MINGW64 c dev ls sqlite3 exe
  • Git:忽略版本控制文件

    gitignore 文件对于忽略一些我们不想控制的文件非常有用 不幸的是 当文件已处于版本控制之下时 它无法使用 例如 我的 gitignore 已添加到 git 中 文件可能与我的同事想要的不同 例如我想忽略 Vim 文件 每当我对此文件
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 如何使用 git 找到一个分支中但不在另一个分支中的所有提交?

    我有两个分行master and live Master是发展 分支并包含尚未准备好进入的提交live 如果在master需要进入的分支live树枝然后他们被樱桃采摘master to live 有时会做出承诺live分支然后是 樱桃摘入m
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content
  • git rebase 吃了我的提交!为我翻译“git reflog”输出?

    我已经完成了五次提交 我想在推送它们之前将它们全部合并为一次提交 出于某种原因 我决定尝试通过与通常使用的不同的方式来做到这一点 FWIW 我试图按照此处的说明进行操作http gitready com advanced 2009 02 1
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4

随机推荐

  • PHP 中的远程 MySQL 连接

    我开始将软件项目从桌面应用程序迁移到 Web 应用程序 目前我正在使用与其安装的桌面关联的本地 PHP MySQL 连接 我希望解决这个问题 并尝试通过我的 1and1 帐户创建一个 MySQL 数据库 我毫不费力地创建了一个数据库并记录了
  • 如何连接多个CString

    所有函数都返回 CString 这是 MFC 代码 必须以 32 和 64 位进行编译 目前我正在使用 CString sURI GetURL sURI GetMethod sURI sURI GetParameters 存在任何方式可以执
  • 无法启动 weblogic BEA-002606

    我在我的 Mac 机器上运行 Weblogic 10 3 的托管实例 有一天 我尝试启动它 但收到此错误消息
  • SQL多次更新同一行

    我们可以考虑对同一行进行多次更新的必要性的一个示例 create table t c1 int insert into t c1 values 1 insert into t c1 values 2 insert into t c1 val
  • JetBrains Fleet:运行 Flutter 项目

    我正在尝试 JetBrains Fleet 我正在考虑在其中制作一个示例 Flutter 项目 但不知道如何配置run json对于 Flutter 项目 终端命令非常简单 flutter run debug or flutter run
  • 如何使用麻雀图在 wp8 中创建简单的区域系列

    我需要为我的 wp8 应用程序创建一个面积系列图表 所以我决定使用 Sparrow 工具包 但不幸的是 网上似乎确实有任何教程 我只是在研究如何开始它 所以如果有人可以给出基本的解释或给我指出一个像样的教程 那就太好了 如果有人知道更好的工
  • 如何获取隐藏 ID 来删除 jQuery 数据表中的记录

    我的 jQuery 数据表中有 编辑 和 删除 按钮 第一列是记录 ID 列并且是隐藏的 我有 编辑 和 删除 按钮的事件处理程序 我应该使用 DataTable click 和 tr 函数的事件处理程序来获取 id 或者如果使用按钮事件处
  • 错误:Fortran 格式字符串中的格式字符串意外结束

    尝试从 Fortran 77 程序编译复制的代码时出现此错误 code 900 FORMAT 1H0 2X ABSOLUTE GRID LIMITS FOR DATA RETENTION FOR RADAR I3 XMIN XMAX 2F8
  • 动态分配的二维数组

    我正在尝试通过动态分配来构建二维数组 我的问题是 它的第一个维度是否有可能采用 100 个值 然后第二个维度将根据我的问题采用可变数量的值 如果可能的话我将如何访问它 我怎么知道第二维度的边界 见代码中的注释 结果你会得到一个如下所示的数组
  • 使用 GetModuleHandle 获取指向 IMAGE_DOS_HEADER 的指针?

    一旦进程加载到内存中 我就试图获取它的图像库 根据我的理解 您可以调用 GetModuleHandle 来获取图像库 我的问题是 返回的句柄本质上是否指向 IMAGE DOS HEADER 结构 以便您可以执行以下操作 PIMAGE DOS
  • 为什么 Rust Closure 在被调用之前取得所有权

    我正在阅读 Rust 这本书 正在阅读描述闭包的章节 我有点困惑为什么以下示例由于闭包获取所有权而出错 fn main let x vec 1 2 3 let equal to x move z z x println can t use
  • 在内联汇编中访问 C++ 类成员

    问题 如何从非 POD 类中访问程序集中的成员变量 详细说明 我已经为类成员函数编写了一些内联汇编代码 但令我困惑的是如何访问类成员变量 我已经尝试过offsetof宏 但这是一个非 POD 类 我当前使用的解决方案是将全局范围的指针分配给
  • 提供密钥时,Google 静态地图始终返回 403

    如果我在地图请求中提供 API 密钥 我总是会收到 403 Forbidden 响应 无需指定 一切都会顺利 我可以到达地图 问题是我必须使用 API 密钥才能监控使用情况和每用户配额 这是一个例子 http jsfiddle net de
  • MySQL中如何存储科学计数法数字

    我想在 MySql 中存储科学记数法数字 我已将它们保存到具有数据类型的字段中decimal 问题是它以正常表示法存储它 至少当我在 MAMP 附带的 Web 控制台中查看数字时看起来是这样 因此您需要为该字段分配更多字节 我相信这会导致拥
  • WebAPI / Owin - 登录后身份未授权

    我正在使用 WebAPI Owin 3 0 实现简单的登录 密码身份验证 这是我的配置方法 public void ConfigureAuth IAppBuilder app Configure the db context and use
  • C++ 类成员的默认值是多少

    C 中结构成员和类成员的默认值是什么 这些规则有何不同 例如 类 结构 基元 等之间 关于默认值的规则是否存在不同的情况 在 C 中 结构和类在这方面没有区别 他们都被称为只是类别类型 一般情况下 类类型的成员没有默认值 为了让类成员获得确
  • Rust 中 tribonacci 序列的惯用实现

    我是 Rust 新手 但作为 Haskell 的粉丝 我非常欣赏这种方式match在 Rust 中工作 现在 我面临着一种罕见的情况 我确实需要失败 从某种意义上说 我希望执行几个重叠案例的所有匹配案例 这有效 fn options sta
  • 有没有一种 CSS 方法可以保证正方形适合窗口而不滚动?

    我可以在 JavaScript 中轻松完成此操作 但想知道是否可以使用直接 CSS 在窗口中保留一个适合窗口大小的方形 div 无论它是什么 我发现的任何解决方案都不能解决高度小于宽度的问题 从逻辑上讲 我想要的是 当窗口宽度小于高度时 给
  • 仅保存活动工作表的宏

    在下面的代码中 它保存了完整的工作簿 我只想保存活动工作表 Sub sbVBS To SAVE ActiveWorkbook ActiveWorkbook Save End Sub 将工作表复制到任何位置都会自动在前台创建一个新工作簿 并将
  • 致命:git 的构建不支持 git-add--interactive (NO_PERL=1)

    当我执行 git add i 时 它会弹出此错误 致命 git 的构建不支持 git add interactive NO PERL 1 我迫切需要帮助 使用 Git 2 25 2020 年第一季度 五年后 Perl 不应再成为git ad