Git 2.8(2016 年 3 月)包含一个非常详细的提交,它解释了 msys2 对于新的git-for-windows的重要性,它在 2015 年初取代了 msysgit。
请参阅Johannes Schindelin ( )提交的 df5218b (2016 年 1 月 13 日) 。(由Junio C Hamano 合并 -- --在提交 116a866中,2016 年 1 月 29 日)dscho
gitster
很长一段时间以来,Git for Windows 都落后于 Git 的 2.x 版本,因为 Git for Windows 开发人员希望让这一大跃进与从 MSys 到 MSys2 的急需跃迁相吻合。
要理解为什么这是一个如此大的问题,需要注意的是 Git 的许多部分不是用可移植的 C 语言编写的,而是 Git 依赖于 POSIX shell 和 Perl 才可用。
为了支持脚本,Git for Windows 必须提供一个最小的 POSIX 仿真层,其中包含 Bash 和 Perl,当 Git for Windows 工作于 2007 年 8 月开始时,该开发人员决定使用MSys,这是 Cygwin 的精简版本。
因此,该项目的原始名称是“msysGit”(遗憾的是,这引起了很多混乱,因为很少有 Windows 用户知道 MSys,甚至更少关心)。
为了编译适用于 Windows 的 Git 的 C 代码,也使用了 MSys:它支持两个版本的 GNU C 编译器:
- 隐式链接到 POSIX 仿真层的一种,
- 另一个针对普通的 Win32 API(带有一些便利功能)。
Git for Windows 的可执行文件是使用后者构建的,因此它们实际上只是 Win32 程序。为了区分需要 POSIX 仿真层和不需要的可执行文件,后者称为 MinGW(Windows 的最小 GNU),而前者称为 MSys 可执行文件。
不过,这种对 MSys 的依赖也带来了挑战:
- 我们对 MSys 运行时的一些更改——更好地支持 Windows 的 Git——没有被上游接受,所以我们必须维护自己的分支。
- 此外,MSys 运行时没有进一步开发以支持例如 UTF-8 或 64 位,除了直到很久以后(
mingw-get
引入时)才缺乏包管理系统,MSys/MinGW 项目提供的许多包都落后于各自的源代码版本,特别是 Bash 和 OpenSSL。
有一段时间,Git for Windows 项目试图通过构建这些包的更新版本来纠正这种情况,但这种情况很快就变得站不住脚,尤其是像 Heartbleed 错误这样的问题需要迅速采取行动,而这与开发 Git 无关。窗户进一步。
令人高兴的是,与此同时,MSys2 项目 ( https://msys2.github.io/ ) 出现了,并被选为 Git for Windows 2.x 的基础。
就像 MSys 一样,MSys2 是 Cygwin 的精简版,但它与 Cygwin 的源代码保持同步。
因此,它在内部已经支持 Unicode,并且它还提供了我们自 Git for Windows 项目开始以来就渴望的 64 位支持。
MSys2 还从 Arch Linux 移植了 Pacman 包管理系统并大量使用它。这为 Linux 用户习惯从yum
orapt-get
和 MacOSX 用户习惯从 Homebrew 或 MacPorts 或 BSD 用户从 Ports 系统到 MSys2 带来了同样的便利:一个简单的操作pacman -Syu
会将所有已安装的包更新到最新版本目前可用。
MSys2 也非常活跃,通常每周提供多次包更新。
仍然需要两个月的努力才能使所有内容达到 Git 的测试套件通过的状态,还有几个月才能发布第一个适用于 Windows 2.x 的官方 Git,并且还有几个补丁等待提交给各自的上游项目. 然而,如果没有 MSys2,Git for Windows 的现代化根本就不会发生。
此提交为支持基于 MSys2 的 Git 构建奠定了基础。
在评论中,这个问题是在 2016 年 1 月提出的:
由于 Windows 版 Git 已经基于 MSYS2,是否已将不依赖于仿真层的二进制文件作为 MSYS2 包提供?
雷·唐纳利当时回答:
我们还没有完全合并,不。不过我们正在努力。
但是... madz 指出,在 2017 年初,这种努力没有成功。
看:
问题是我无法及时贡献会导致新的 msys2-runtime 的更改。
不过,这并不是什么大问题:我只会让 Git for Windows 的分支无限期地运行。
因此,维基现在提到(2018 年):
Git for Windows 为 msys2-runtime 创建了一些尚未发送到上游的补丁。(这是计划好的,但在 issue #284 中确定它可能不会发生。)
这意味着您必须为 Windows 自定义 msys2-runtime 安装 Git,才能在 MSYS2 中拥有一个完全工作的 git。
请注意,自提交 aeb582a9(Git 2.22,2019 年第二季度)以来,Git for Windows 项目开始升级到基于 Cygwin v3.x 的 MSYS2 运行时版本。
mingw
:允许使用 MSYS2 运行时 v3.x 进行构建
最近 Git for Windows 项目开始升级到基于 Cygwin v3.x 的 MSYS2 运行时版本。
这具有非常显着的后果,$(uname -r)
不再报告以“2”开头的版本,而是以“3”开头的版本。
这破坏了我们的构建,因为df5218b ( config.mak.uname
: support MSys2, 2016-01-13, Git v2.8.0-rc0) 根本没想到报告的版本uname -r
依赖于底层 Cygwin 版本:它期望报告的版本与“ 2”在“MSYS2”。
因此,让我们反转该测试用例以测试除以“1”开头的版本(用于 MSys)之外的任何其他内容。
即使 Cygwin 最终发布像 314.272.65536 这样的版本,这也应该为我们的未来提供保障。
Git 2.22(2019 年第二季度)将针对 MSYS2 运行时 v3.x 系列的更新进行面向未来的测试。
请参阅Johannes Schindelin ( ) 的commit c871fbe(2019 年 5 月 7 日)。(由Junio C Hamano 合并 -- --在提交 b20b8fe中,2019 年 5 月 19 日)dscho
gitster
t6500(mingw)
: 使用 shell 的 Windows PID
在 Git for Windows 中,我们使用 MSYS2 Bash,它从 Cygwin 的 POSIX 仿真层继承了一个非标准的 PID 模型:每个 MSYS2 进程都有一个常规的 Windows PID,此外它还有一个 MSYS2 PID(对应于模拟的影子进程) Unix 风格的信号处理)。
升级到 MSYS2 运行时 v3.x 后,无法再通过此影子进程访问OpenProcess()
,因此 t6500 错误地认为其中引用的进程gc.pid
(在此上下文中实际上不是真正的gc
进程,而是当前的 shell)不再存在。
让我们通过确保
gc.pid
在此测试脚本中写入 Windows PID 来解决此问题,以便git.exe
能够理解该进程确实仍然存在。