Git的2.8(2016年3月),包括一个非常详细的承诺这解释msys2的新的重要性混帐的窗口,其取代msysgit在2015年初。
参见Johannes Schindelin()的commit df5218b(2016年1月13日)。(由Junio C Hamano合并--在commit 116a866中,2016年1月29日)dscho
gitster
长期以来,Windows的Git落后于Git的2.x版本,因为Windows的Git开发人员希望让这一大跃进与从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仿真层的可执行文件,当前者称为MSys可执行文件时,后者称为MinGW(Windows的最小GNU)。
但是,对MSys的依赖也带来了挑战:
- 我们对MSys运行时所做的某些更改(更好地支持Windows的Git所必需的)未在上游接受,因此我们必须维护自己的fork。
- 此外,MSys运行时并未得到进一步开发以支持UTF-8或64位,并且除了缺少软件包管理系统(直到后来)(
mingw-get
引入时)之外,MSys / MinGW项目提供的许多软件包都落后于各自源代码版本,尤其是Bash和OpenSSL。
有一段时间,Git for Windows项目试图通过尝试构建这些软件包的较新版本来纠正这种情况,但是这种情况很快变得难以为继,尤其是诸如Heartbleed错误之类的问题,需要迅速采取行动,而这与开发Git无关。 Windows进一步。
令人高兴的是,与此同时,出现了MSys2项目(https://msys2.github.io/),并被选为Windows 2.x Git的基础。
就像MSys一样,MSys2是Cygwin的精简版本,但是它积极地与Cygwin的源代码保持同步。
因此,它已经在内部支持Unicode,并且还提供了自Git for Windows项目开始以来我们所渴望的64位支持。
MSys2还从Arch Linux移植了Pacman软件包管理系统,并大量使用它。这为使用Linux yum
或Linux的用户apt-get
,以及使用Homebrew或MacPorts的MacOSX用户或使用Ports系统的BSD用户提供了相同的便利:pacman -Syu
将所有已安装的软件包更新为最新版本目前可用。
MSys2也非常活跃,通常每周提供多次软件包更新。
它仍然需要两个月的时间才能使所有内容都通过Git的测试套件通过,还需要几个月的时间,直到第一个正式的Windows 2.x正式版Git发布,并且还有两个补丁仍在等待提交给各自的上游项目。 。但是,如果没有MSys2,Windows的Git现代化根本就不会发生。
这一承诺为支持基于MSys2的Git构建奠定了基础。
在评论中,于2016年1月提出问题:
由于Windows的Git已经基于MSYS2,因此是否将不依赖于仿真层的二进制文件作为MSYS2软件包提供了?
雷·唐纳利当时回答:
我们尚未完全合并,不。我们正在努力。
但是... madz 指出,在2017年初,这种努力并未奏效。
看到:
问题是我无法做出及时导致新的msys2-runtime的更改。
不过,这不是什么大问题:我将让Git for Windows的fork无限期地运行。
因此,Wiki现在提到(2018):
Git for Windows为msys2-runtime创建了一些尚未向上游发送的补丁。(这已经计划好了,但是在问题#284中确定可能不会发生。)
这意味着您必须安装Git for Windows定制的msys2-runtime,才能在MSYS2中具有完全正常的git。
请注意,由于提交了aeb582a9(Git 2.22,2019年第二季度),因此Git for Windows项目启动了基于Cygwin v3.x的MSYS2运行时版本的升级过程。
mingw
:允许使用MSYS2运行时v3.x进行构建
最近,用于Windows的Git项目开始了基于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版本,因此这会中断我们的构建:它希望报告的版本与“ “ MSYS2”中的“ 2”。
因此,让我们反转该测试用例以测试除以“ 1”开头的版本(对于MSys)以外的其他任何内容。
即使Cygwin最终发布了314.272.65536之类的版本,这也应该为我们的未来提供保障。
Git 2.22(Q2 2019)将针对MSYS2运行时v3.x系列的更新进行未来测试。
参见Johannes Schindelin()的commit c871fbe(2019年5月7日)。(由Junio C Hamano合并--在commit b20b8fe中,2019年5月19日)dscho
gitster
t6500(mingw)
:使用外壳的Windows PID
在Windows的Git中,我们使用了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
能够理解该进程确实仍然存在。