git 常用命令
git 有用的命令
git .ignore
直接匹配模式,允许使用正则:
1 | *dad/ |
git .attributes
.gitattributes 文件使用一种简单的基于行的语法,用于为仓库中的文件路径定义特定的属性。其基本语法如下:
1 | 模式 属性1 属性2 属性3 ... |
- 模式:采用类似
.gitignore的 glob 模式匹配文件路径。 - 属性:可以是一个或多个属性,用空格分隔。
模式规则
- 支持通配符:
*匹配任意字符串(不包括路径分隔符),**匹配任意路径,?匹配单个字符,[abc]匹配字符集。 - 以
/开头表示从仓库根目录匹配。 - 以
/结尾表示匹配目录(但属性通常作用于文件,目录本身不应用属性)。 - 可以在模式前加
!表示否定(忽略匹配),但较少用。
属性赋值语法
属性可以有多种形式:
- 设置:直接写属性名,如
text,表示开启该属性。 - 取消:在属性名前加
-,如-text,表示关闭该属性。 - 键值对:
属性名=值,如eol=lf、diff=php。 - 布尔值:某些属性可接受布尔值,如
text默认开启,text=auto表示自动检测。
多属性与优先级
- 一行可以指定多个属性,空格分隔。
- 如果一个文件匹配多个规则,后面的规则会覆盖前面的规则(按文件中的顺序)。
- Git 有内置的默认属性(如对文本文件自动启用
text=auto),但显式设置会覆盖默认。
注释与空行
- 以
#开头的行是注释,会被忽略。 - 空行也会被忽略。
转义字符
如果文件名或模式中包含空格或 # 等特殊字符,可以使用反斜杠 \ 转义。例如:
1 | file\ with\ space.txt text |
示例
1 | # 所有文本文件使用 LF 换行符(检出时) |
常用属性说明
text:开启换行符转换(Git 会在提交时转换为 LF,检出时根据配置转换)。eol:指定检出时的换行符(lf或crlf),需配合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=语言名称 |
重要说明:
- 语言名称不区分大小写,也可以使用别名(如
js、javascript、JAVASCRIPT都表示 JavaScript) - 如果语言名称包含空格,需要用连字符替换(例如
Objective-C写作Objective-C) - 这个配置需要提交到仓库后才会在 GitHub/GitLab 上生效
实际应用场景
强制指定语言统计
当文件的扩展名与其实际语言不符时(例如您提到的 .zip 文件,但通常 zip 是二进制包,里面可能包含 C 源码),可以使用此属性覆盖 GitHub 的自动检测:
1 | # 将所有 .inc 文件标记为 Pascal 语言 |
实际项目中的示例:
1 | *.pas 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 |
即使语言类型为 data 或 prose,也强制计入统计 |
完整示例
一个综合性的 .gitattributes 配置可能如下:
1 | # 强制指定语言 |