Windows上的Git(Git for Windows)本质上是一个在Windows平台上“模拟/移植”类Unix Git使用体验的工程集合,而不是原生Unix Git
它不是简单的git.exe,而是
- Git本身(源码几乎与Linux一致)
- 一整套Unix兼容层
- 一堆GNU工具的移植版本
- Windows特有的glue code
历史背景
Git诞生的环境是
- Linux
- POSIX
- GNU工具链
- shell/fork/pipe/symlink/case-sensitive FS
而Windows原生环境缺失这些假设,Git for Windows通过在Windows上构建一个最小可用的Unix来实现
早期的移植方式是
- MSysGit:最早的官方Windows移植版本
- 基于MinGW(Minimalist GNU for Windows)
- 使用Cygwin或MSYS提供POSIX兼容层
当前的官方移植
- Git核心命令(C语言编写,为Windows编译)
- MSYS2运行时(提供POSIX环境)
- Windows原生工具集成
Git for Windows移植细节
Git本体
与Linux Git使用同一套源码,绝大多数Git行为是平台无关的,差异集中在
- 文件系统
- 进程模型
- 路径处理
- 权限语义
兼容层
Git for Windows基于MSYS2/MinGW技术栈
| 组件 | 作用 |
|---|---|
| MSYS2 | 提供类Unix环境 |
| MinGW-w64 | 用GCC把Unix程序编译成Windows可执行文件 |
| POSIX shim | 模拟fork/exec/pipe/signal |
GNU工具集
Git for Windows自带大量GNU工具,这些工具不等于Linux系统里的GNU Coreutils,区别包括
- 功能不全
- 行为略有不同
- bug修复节奏不同
- 性能较弱
Git Bash
Git Bash本质是一个bash.exe,跑在MSYS2环境,使用虚拟POSIX路径系统
架构对比
Linux/macOS原生Git:
Git命令 → 系统调用 → Linux内核
Windows Git:
Git命令 → MSYS2层 → Win32 API → Windows内核
↘ 部分原生Windows实现
移植带来的特点
优点
- 命令兼容性 大多数Linux Git命令在Windows上同样工作
git log --oneline --graph --all
git grep "search_term"
- shell环境 Git Bash提供bash shell和常用Unix工具
ls -la | grep .git
find . -name "*.js"
限制/差异
- 文件系统差异
Windows路径分隔符是
\, Git内部使用/
git add folder \file.txt # 需要转义或使用/
# Git内部会转换为/
git add folder/file.txt
- 权限系统 Windows没有Linux的权限位
git update-index --chmod=+x script.sh # 只能设置“可执行”标记
- 符号链接 需要特别配置
git config --global core.symlink true
Windows原生Git组件
虽然基于移植,但有很多Windows原生优化
性能优化
- 文件系统监控(需要管理员权限)
git config --global core.fscache true
- 内置文件系统缓存
git config --global core.preloadindex true
- 并行索引加载
git config --global core.untrackedcache true
Windows集成特性
- 凭据管理器
git config --global credential.helper manager-core
- 换行符自动处理
git config --global core.autocrlf true
- Windows控制台支持 Git 2.34+ 改进的Windows终端支持