Git 命令中的<pathspec></pathspec>
参数:灵活运用Git 的强大功能
在查阅Git 命令文档时,你可能会注意到许多命令都包含<pathspec></pathspec>
选项。起初,你可能认为这只是“路径”的一种技术说法,只能接受目录和文件名。然而,深入了解后你会发现,Git 命令中的<pathspec></pathspec>
远比你想象的强大。
<pathspec></pathspec>
是Git 用于限制Git 命令作用范围的机制,它将命令的执行范围限定在仓库的子集。即使你没有意识到,你可能已经在使用<pathspec></pathspec>
了。例如,在命令git add README.md
中,<pathspec></pathspec>
就是README.md
。但<pathspec></pathspec>
能够实现更精细、更灵活的操作。
学习<pathspec></pathspec>
的好处在于,它能显着增强许多Git 命令的功能。例如,使用git add
,你可以只添加单个目录中的文件;使用git diff
,你可以检查仅对扩展名为.scss
的文件名所做的更改;你还可以使用git grep
搜索所有文件,但排除/dist
目录中的文件。
此外,<pathspec></pathspec>
有助于编写更通用的Git 别名。例如,我有一个名为git todo
的别名,它将搜索我所有存储库文件中的字符串“todo”。但是,我希望它显示字符串的所有实例,即使它们不在我的当前工作目录中。使用<pathspec></pathspec>
,我们可以实现这一点。
文件或目录
使用<pathspec></pathspec>
最直接的方法是使用目录和/或文件名。例如,使用git add
,你可以执行以下操作: .
、 src/
和README
分别是每个命令的<pathspec></pathspec>
。
git add . # 添加当前工作目录(CWD) git add src/ # 添加src/ 目录git add README # 只添加README 文件
你也可以向一个命令添加多个<pathspec></pathspec>
:
git add src/ server/ # 添加src/ 和server/ 目录
有时,你可能会看到命令的<pathspec></pathspec>
前面有一个--
。这是用来消除<pathspec></pathspec>
和命令其他部分之间歧义的。
通配符
除了文件和目录外,你还可以使用*
、 ?
和[]
来匹配模式。 *
符号用作通配符,它将匹配路径中的/
—— 换句话说,它将搜索子目录。
git log '*.js' # 记录CWD 和子目录中的所有.js 文件git log '.*' # 记录CWD 中所有“隐藏”文件和目录git log '*/.*' # 记录子目录中所有“隐藏”文件和目录
引号非常重要,尤其是在使用*
时。它们可以防止你的shell(例如bash 或ZSH)自行扩展通配符。例如,让我们看看git ls-files
如何在使用和不使用引号的情况下列出文件。
# 示例目录结构# # . # ├── package-lock.json # ├── package.json # └── data # ├── bar.json # ├── baz.json # └── foo.json git ls-files *.json # package-lock.json # package.json git ls-files '*.json' # data/bar.json # data/baz.json # data/foo.json # package-lock.json # package.json
由于shell 在第一个命令中扩展了*
, git ls-files
收到的命令是git ls-files package-lock.json package.json
。引号确保Git 是扩展通配符的一方。
你还可以使用?
字符作为单个字符的通配符。例如,要匹配mp3 或mp4 文件,你可以执行以下操作。
git ls-files '*.mp?'
方括号表达式
你还可以使用“方括号表达式”来匹配集合中的单个字符。例如,如果你想匹配TypeScript 或JavaScript 文件,可以使用[tj]
。这将匹配t
或j
。
git ls-files '*.[tj]s'
这将匹配.ts
文件或.js
文件。除了使用字符外,还可以引用方括号表达式中某些字符集合。例如,你可以在方括号表达式中使用[:digit:]
来匹配任何十进制数字,或者使用[:space:]
来匹配任何空格字符。
git ls-files '*.mp[[:digit:]]' # mp0, mp1, mp2, mp3, ..., mp9 git ls-files '*[[:space:]]*' # 匹配包含空格的任何路径
要了解更多关于方括号表达式及其使用方法的信息,请查看GNU 手册。
魔法签名
<pathspec></pathspec>
还拥有名为“魔法签名”的特殊工具,它可以为你的<pathspec></pathspec>
解锁一些额外的功能。这些“魔法签名”是通过在<pathspec></pathspec>
的开头使用:(signature)
来调用的。如果不明白,别担心:一些例子应该会有所帮助。
top
top
签名告诉Git 从Git 仓库的根目录而不是当前工作目录匹配模式。你也可以使用简写/
而不是:(top)
。
git ls-files ':(top)*.js' git ls-files ':/*.js' # 简写
这将列出仓库中所有扩展名为.js
的文件。使用top
签名,这可以在仓库中的任何子目录中调用。我发现这在编写通用的Git 别名时特别有用!
git config --global alias.js 'ls-files -- ':(top)*.js''
你可以使用git js
在你的仓库中的任何位置获取项目中所有JavaScript 文件的列表。
icase
icase
签名告诉Git 在匹配时忽略大小写。如果你不关心文件名的大小写,这将非常有用——例如,这对于匹配jpg 文件非常有用,jpg 文件有时使用大写扩展名JPG。
git ls-files ':(icase)*.jpg'
literal
literal
签名告诉Git 按字面意思对待所有字符。如果你想将*
和?
等字符作为其本身而不是通配符来对待,则可以使用此选项。除非你的仓库的文件名包含*
或?
,否则我不认为这个签名会被经常使用。
git log ':(literal)*.js' # 返回文件'*.js' 的日志
glob
当我开始学习<pathspec></pathspec>
时,我注意到通配符的工作方式与我习惯的不同。通常,我看到单个星号*
作为不匹配目录中任何内容的通配符,而连续星号( **
) 作为“深度”通配符,将匹配目录中的名称。如果你更喜欢这种风格的通配符,你可以使用glob
魔法签名!
如果你想更精细地控制搜索项目目录结构的方式,这将非常有用。例如,让我们看看这两个git ls-files
如何搜索React 项目。
git ls-files ':(glob)src/components/*/*.jsx' # “顶级”jsx 组件git ls-files ':(glob)src/components/**/*.jsx' # “所有”jsx 组件
attr
Git 能够为特定文件设置“属性”。你可以使用.gitattributes
文件设置这些属性。
<code># .gitattributes src/components/vendor/* vendored # 设置“vendored”属性src/styles/vendor/* vendored</code>
使用attr
魔法签名可以为你的<pathspec></pathspec>
设置属性要求。例如,我们可能希望忽略来自供应商的上述文件。
git ls-files ':(attr:!vendored)*.js' # 搜索非vendored 的js 文件git ls-files ':(attr:vendored)*.js' # 搜索vendored 的js 文件
exclude
最后,是“ exclude
”魔法签名(简写为:!
或:^
)。此签名的工作方式与其他魔法签名不同。在解析所有其他<pathspec></pathspec>
后,将解析所有带有exclude
签名的<pathspec></pathspec>
,然后将其移除返回的路径。例如,你可以搜索所有.js
文件,同时排除.spec.js
测试文件。
git grep 'foo' -- '*.js' ':(exclude)*.spec.js' # 搜索.js 文件,排除.spec.js git grep 'foo' -- '*.js' ':!*.spec.js' . # 与上述相同的简写
组合签名
没有什么可以限制你在单个<pathspec></pathspec>
中使用多个魔法签名!你可以在括号内用逗号分隔你的魔法词来使用多个签名。例如,如果你想从仓库的底部(使用top
)、不区分大小写(使用icase
)、仅使用已创作的代码(使用attr
忽略供应商文件)以及使用glob 风格的通配符(使用glob
)进行匹配,则可以执行以下操作。
git ls-files -- ':(top,icase,glob,attr:!vendored)src/components/*/*.jsx'
你无法组合的两个魔法签名是glob
和literal
,因为它们都会影响Git 处理通配符的方式。这在Git 词汇表中提到,也许是我在任何文档中读到的最喜欢的句子。
Glob 魔法与literal 魔法不兼容。
<pathspec></pathspec>
是许多Git 命令的一个组成部分,但其灵活性并非立即可见。通过学习如何使用通配符和魔法签名,你可以成倍地提高你在Git 命令行上的能力。
以上是git Pathspecs以及如何使用它们的详细内容。更多信息请关注PHP中文网其他相关文章!

有一个新的Web功能,称为“蒙版”图标,即将推出Firefox Preview和其他Web浏览器。这种新的图标格式将使您的PWA在Android上具有自己的自适应图标。

当他们在2013年去Chrome时,我们失去了歌剧。与Edge今年早些时候也进行了同样的交易。迈克·泰勒(Mike Taylor)称这些变化为“减少


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

记事本++7.3.1
好用且免费的代码编辑器

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),