首页/开发/Git 与协作速查/gitattributes 进阶属性
进阶与大仓实践69 条

gitattributes 进阶属性

除行尾与 LFS 外,属性还能控制差异显示、合并驱动、导出打包与语言统计:diff、merge、export-ignore、export-subst、linguist 等。

Git 与协作速查开发更新于 2026-10-13

gitattributes 进阶是什么

gitattributes 除了控制行尾与 LFS 之外,还能声明差异显示方式、合并驱动、打包导出与语言统计等行为。文件按「模式 属性列表」逐行描述,随分支入库,因此同一仓库在不同分支上可能表现不同。检查别人仓库时,先用 git check-attr 确认某路径真实生效的属性。

基本信息

核心命令git check-attr -a <路径> 查看生效属性
常用位置仓库根 .gitattributes;也可放子目录,作用限于该目录树
差异选项text、-diff、diff=<驱动>
导出选项export-ignore、export-subst(git archive 打包时生效)
平台统计linguist-vendored、linguist-generated(托管站语言统计用)

典型使用场景

  • 发布包控制:git archive 时排除测试、CI 与文档目录
  • 生成文件与锁文件:标注为不显示差异,评审更安静
  • 第三方代码目录:标记 vendor 属性,让语言统计只算自家代码
  • 自定义文本转换:为特定后缀指定 diff 驱动或合并策略
  • 模板替换:export-subst 在打包时把格式化占位符替换成提交信息

属性示例

属性示例
# 打包发布时排除测试与 CI 文件
/tests/ export-ignore
/.github/ export-ignore
# 第三方目录不计入语言统计
vendor/** linguist-vendored
# 生成文件不显示逐行差异
package-lock.json -diff
# 校验用:查看某路径最终生效的属性值
git check-attr -a vendor/lib.js

常见属性

属性作用生效对象
text 与 eol行尾规范与检出风格检出、提交、diff
-diff 或 diff=驱动按二进制跳过或自定义差异diff 与 log 显示
export-ignoregit archive 打包时排除发布归档
export-subst打包时替换占位符发布归档
linguist-vendored标记第三方代码托管平台语言统计
属性文件随分支变化:同一文件在 feature 分支与 main 上的属性可能不同,排查差异显示问题先看当下生效值。
属性模式的大小写敏感性跟随文件系统与 core.ignorecase;跨平台团队在 Windows、macOS 与 Linux 上都要验证同一模式命中的文件是否一致。

易错点

  • 把 export-ignore 当权限控制:它只影响 git archive 生成的归档,clone 与检出不受影响,敏感文件要换别的机制排除
  • 属性写错位置:放在子目录的 .gitattributes 只作用于该目录树,想全仓生效必须放仓库根目录
  • 忽略大小写差异:Windows 与 macOS 上命中的文件在 Linux 上可能不命中,跨平台团队要用 git check-attr 在两边各验一次
  • 自定义 diff 驱动未配置:属性里引用的驱动名需要对应 git config 的驱动设置,缺配置时行为静默退回默认

数据来源与参考

  • Git 官方文档:gitattributes(export-ignore/-diff/linguist)
  • Pro Git 2nd Edition · 8.2 Git 属性
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌