git相关技巧

  • ~2.79K 字
  1. 1. git 常用命令
  2. 2. git 有用的命令
  3. 3. git .ignore
  4. 4. git .attributes
    1. 4.1. 模式规则
    2. 4.2. 属性赋值语法
    3. 4.3. 多属性与优先级
    4. 4.4. 注释与空行
    5. 4.5. 转义字符
    6. 4.6. 示例
    7. 4.7. 常用属性说明
    8. 4.8. 生效与规范化
    9. 4.9. 指定指定语言模式属性
      1. 4.9.1. 核心配置方法
    10. 4.10. 实际应用场景
      1. 4.10.1. 强制指定语言统计
    11. 4.11. 验证配置是否生效
    12. 4.12. 其他相关的语言属性
    13. 4.13. 完整示例
  5. 5. git 关于ignore和attribute的命令(文件变更)

git 常用命令

git 有用的命令

git .ignore

直接匹配模式,允许使用正则:

1
2
3
4
*dad/
adad/adad*.c
dadad/**
!dadadw/

git .attributes

.gitattributes 文件使用一种简单的基于行的语法,用于为仓库中的文件路径定义特定的属性。其基本语法如下:

1
模式 属性1 属性2 属性3 ...
  • 模式:采用类似 .gitignore 的 glob 模式匹配文件路径。
  • 属性:可以是一个或多个属性,用空格分隔。

模式规则

  • 支持通配符:* 匹配任意字符串(不包括路径分隔符),** 匹配任意路径,? 匹配单个字符,[abc] 匹配字符集。
  • / 开头表示从仓库根目录匹配。
  • / 结尾表示匹配目录(但属性通常作用于文件,目录本身不应用属性)。
  • 可以在模式前加 ! 表示否定(忽略匹配),但较少用。

属性赋值语法

属性可以有多种形式:

  1. 设置:直接写属性名,如 text,表示开启该属性。
  2. 取消:在属性名前加 -,如 -text,表示关闭该属性。
  3. 键值对属性名=值,如 eol=lfdiff=php
  4. 布尔值:某些属性可接受布尔值,如 text 默认开启,text=auto 表示自动检测。

多属性与优先级

  • 一行可以指定多个属性,空格分隔。
  • 如果一个文件匹配多个规则,后面的规则会覆盖前面的规则(按文件中的顺序)。
  • Git 有内置的默认属性(如对文本文件自动启用 text=auto),但显式设置会覆盖默认。

注释与空行

  • # 开头的行是注释,会被忽略。
  • 空行也会被忽略。

转义字符

如果文件名或模式中包含空格或 # 等特殊字符,可以使用反斜杠 \ 转义。例如:

1
file\ with\ space.txt text

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 所有文本文件使用 LF 换行符(检出时)
*.txt text eol=lf

# 所有 .bat 文件使用 CRLF
*.bat text eol=crlf

# 二进制文件不进行换行符转换
*.png binary
# 或者使用 -text(等价)
*.jpg -text

# 为特定文件设置 diff 驱动
config/settings.xml diff=xml

# 匹配所有 .js 文件,但排除 minified 文件
*.js text eol=lf
min/*.js -text

# 其他项目示例
*.elf filter=lfs diff=lfs merge=lfs -text
*.exe filter=lfs diff=lfs merge=lfs -text
*.pdb filter=lfs diff=lfs merge=lfs -text

常用属性说明

  • text:开启换行符转换(Git 会在提交时转换为 LF,检出时根据配置转换)。
  • eol:指定检出时的换行符(lfcrlf),需配合 text 使用。
  • binary:等同于 -text -diff,表示二进制文件,不进行任何转换或 diff。
  • diff:指定 diff 驱动,如 diff=astextplain
  • merge:指定合并驱动。
  • filter:指定过滤器,用于 clean/smudge 操作。

生效与规范化

  • .gitattributes 文件本身应提交到仓库,以便所有协作者使用相同规则。
  • 修改 .gitattributes 后,需要运行 git add --renormalize . 来重新应用换行符等规范化处理。

指定指定语言模式属性

属性主要影响代码托管平台(GitHub、GitLab)上的语言统计和语法高亮显示,并不会改变 Git 本身对文件内容的处理方式。

核心配置方法

使用 linguist-language 属性,语法格式为:

1
文件模式 linguist-language=语言名称

重要说明

  • 语言名称不区分大小写,也可以使用别名(如 jsjavascriptJAVASCRIPT 都表示 JavaScript)
  • 如果语言名称包含空格,需要用连字符替换(例如 Objective-C 写作 Objective-C
  • 这个配置需要提交到仓库后才会在 GitHub/GitLab 上生效

实际应用场景

强制指定语言统计

当文件的扩展名与其实际语言不符时(例如您提到的 .zip 文件,但通常 zip 是二进制包,里面可能包含 C 源码),可以使用此属性覆盖 GitHub 的自动检测:

1
2
3
4
5
# 将所有 .inc 文件标记为 Pascal 语言
*.inc linguist-language=Pascal

# 将所有 .es 文件标记为 JavaScript
*.es linguist-language=js

实际项目中的示例:

1
2
*.pas linguist-language=Pascal
*.dpr linguist-language=Pascal

验证配置是否生效

可以使用以下命令检查属性是否正确应用:

1
git check-attr linguist-language -- *.zip

如果返回类似以下内容,则表示配置成功:

1
*.zip: linguist-language: C

其他相关的语言属性

除了 linguist-language,GitHub 的 Linguist 工具还支持其他几个有用的属性来控制文件的分类:

属性 作用
linguist-documentation 标记为文档文件,从语言统计中排除
linguist-generated 标记为自动生成的文件,在 diff 中隐藏,从统计中排除
linguist-vendored 标记为第三方库/依赖文件,从统计中排除
linguist-detectable 即使语言类型为 dataprose,也强制计入统计

完整示例

一个综合性的 .gitattributes 配置可能如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 强制指定语言
*.zip linguist-language=C
*.inc linguist-language=Pascal
*.es linguist-language=JavaScript

# 排除不需要统计的文件
vendor/** linguist-vendored
docs/** linguist-documentation
*.min.js linguist-generated

# 同时指定换行符(结合之前的讨论)
*.c text eol=lf
*.h text eol=lf

git 关于ignore和attribute的命令(文件变更)

打赏
打赏提示信息
分享
分享提示信息