Git默认是为Linux设计,在Windows上编译的话,需要一个类Linux环境。 Git for Windows是一个提供此环境的项目,其Github主页是:https://github.com/git-for-windows/git

生成安装包

Technical overview解释了什么是Git for Windows,以及怎么操作它。 简单地说,它是一个基于MSYS的类Linux运行环境。在这个环境里面可以编译Git源代码,然后打包生成的二进制文件。

首先是下载它的SDK。到Download Git for Windows SDK页面, 当前64位的最新版是git-sdk-installer-1.0.8-64.7z.exe,下载以后安装,默认的安装路径是C:\git-sdk-64。 完成之后在桌面会有一个Git SDK 64-bit的快捷方式。

通过Git SDK 64-bit可以进入一个Git Bash窗口。在其中可以使用命令sdk init githttps://github.com/git-for-windows/git下载git源代码。

git代码会放在/usr/src/git,可以通过sdk cd git进入。

有一个一次性的操作需要做一下:

cd /usr/src/build-extra
git fetch
git checkout main

执行操作:./portable/release.sh v2.35.1.windows.2-test, 则在用户目录下生成PortableGit-v2.35.1.windows.2-test-64-bit.7z.exe。

生成的7z档案文件支持命令行,比如:.\PortableGit-2.11.0-64-bit.7z.exe -y -gm2 -InstallPath="C:\\use\\double\\backslashes"。 可参考Zip Archives extracting the released archives

编译Git

根据Building Git, 在SDK的Shell中执行cd /usr/src/git,然后检出一个分支,比如git checkout 2.35.1.windows.2, 然后执行make test

如果要获取编译测试的统计信息,则执行:

cd /usr/src/git/t
/usr/bin/time prove -j 5 --state=failed,save ./t[0-9]*.sh

更新SDK

Updating your SDK

更新SDK需要关掉所有的GitBash窗口,以防有文件被锁住。 需要启动Windows的cmd来更新,然后进入C:\git-sdk-64\。 然后在此cmd窗口中执行update-via-pacman.bat。 不管有没有更新,每次总会重装git-extra

也可以直接在文件浏览器中双击运行update-via-pacman.bat来完成更新。

还可以调用pacman -Syu来更新。过程中可能需要关掉重开git-bash,也许需要多次执行pacman -Syu

核心的软件包msys2-runtime、 bash以及pacman 需要通过pacman -Syu来一齐更新,因为这些软件在编译的时候互相依赖。 要保证他们的互相依赖是正确的。 另一可选的办法是执行执行C:\git-sdk-64\git-cmd来弹出一个cmd窗口,在其中执行pacman -Sy --needed msys2-runtime && pacman -S --needed pacman bash

如果遇到某些错误无法更新,那么总是可以选择下载一个新的SDK,重新安装之。过程中,你可以选择保留旧SDK中的usr/src,将其同步到新的SDK中。

也可以查看git update-git-for-windows -h

包管理相关

Package management

Git for Windows基于MSYS2。MSYS2和MSYS1相比,引进了包管理器msys。

更多参考The difference between MINGW and MSYS2

可以通过pacman -S <package-name>安装软件包。-Sy可以确保软件包最新。pacman -Syu将所有软件包升级到最新。

建议将msys2-runtime、bash和pacman分开来,单独升级。总之有可能会遇到比较奇怪的问题。

删除软件包pacman -R <package-name>

列举软件包pacman -Q;查询软件包内容pacman -Ql <package-name>;查询文件所属的软件包pacman -Qo <file-name>

Git for windows有三个相关的pacman仓库

perl软件包不属于pacman管理。

其他

Git cannot create a file or directory with a long path

默认情况下,文件路径不能超过255个字符。 通过git config core.longpaths true可以允许部分命令行命令接受超过255字符的文件路径。 此是Win32 API自带的问题,通过形如\\?\...的UNC文件名可以在一定程度上避免此问题。

MinGit

MinGit is Git for Windows Applications,剥离了很多用于命令行交互的部分。

可以从https://github.com/git-for-windows/git/releases下载,比如MinGit-2.35.1.2-64-bit.zip

(本篇完)

2022-03-14更新

Win32API的一个旧有问题,文件路径不能太长,比如不能超过255个字节,否则就会出错。Git for Windows也受此影响,查看Git cannot create a file or directory with a long path,太长的文件名有可能导致File or path name too long的错误。

这个问题在议疏Windows, Pathname too long (>256 chars) #52中讨论过,对应的铺改是[issue52] adding support for long path names on Windows #85

对于用户来说,只须设置git config core.longpaths true即可。

根据Maximum Path Length Limitation,Win10 1607引入了对长路径名的支持,但是需要通过注册表打开:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001

(更新完)

2022-10-10更新

Git for Windows其实预置了下面两个命令:

  • start-ssh-pageant.cmd,用于连接PuTTY的pageant
  • start-ssh-agent.cmd,用于连接OpenSSH的agent。

(更新完)

2022-11-18更新

配置git-bash为VSCode默认终端

(更新完)