git Pathspecs以及如何使用它們
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tartanify.com上,我們收集了5,000多個格子呢
