跳到主要内容

Git Attributes 使用

提示

.gitattributes 是 Git 的属性配置文件,用于对特定路径或文件设置行为规则。规则按路径匹配,可放在仓库根目录或子目录中。官方文档参考:自定义 Git - Git 属性

主要功能

行尾符处理(eol)

跨平台协作时,Windows(CRLF)与 Unix(LF)行尾符不一致会导致大量无意义的 diff。text 属性控制 Git 如何处理换行:

# 所有文本文件统一使用 LF
* text=auto eol=lf

# 强制特定文件使用 CRLF
*.bat text eol=crlf

文件差异对比(diff)

为二进制文件或特殊格式文件自定义 diff 展示方式:

# Word 文档使用自定义 diff driver
*.docx diff=word

# 图片文件标记为二进制,不产生 diff 噪声
*.png binary
*.jpg binary

合并策略(merge)

控制特定文件在 git merge 时采用哪种合并策略。

备注

merge=ours 仅对两侧分支都已存在的文件生效,触发条件是发生合并冲突时。对于只存在于对方分支的新增文件,Git 视为干净新增,不会触发 merge driver。

内置策略:

  • merge=ours:始终保留当前分支版本,忽略对方修改
  • merge=union:将两侧内容合并(适合无结构的列表文件)
  • merge=binary:当作二进制处理,冲突时保留当前版本

导出归档时排除文件(export-ignore)

执行 git archive 打包时,标记为 export-ignore 的文件不会被包含在归档包中:

.gitattributes export-ignore
.github export-ignore
tests/ export-ignore

关键字展开(ident)

启用后,Git 会在 checkout 时将文件中的 $Id$ 替换为文件内容的 SHA-1 摘要:

*.c ident

场景举例:避免锁文件合并冲突

背景

package-lock.jsonyarn.lockgo.sum 等锁文件由工具自动生成,多人协作时极容易产生合并冲突。手动解决这类冲突毫无意义——合并后仍需重新执行 npm install / go mod tidy 来重新生成正确的内容。

解决方案

.gitattributes 中为锁文件配置 merge=ours,合并时始终保留当前分支的版本,合并后重新生成即可。

第一步:配置 merge driver(只需执行一次)

git config merge.ours.driver true

# 团队协作时写入全局配置,避免每人都需要单独配置
git config --global merge.ours.driver true

第二步:在 .gitattributes 中声明锁文件策略

package-lock.json merge=ours
yarn.lock merge=ours
go.sum merge=ours

效果

合并时遇到锁文件冲突,Git 自动保留当前分支的版本,不再需要手动解决冲突。合并完成后重新生成锁文件:

# Node 项目
npm install

# Go 项目
go mod tidy

重新生成的锁文件反映合并后的真实依赖状态,比手动解决冲突更准确。