之间的区别。 git 中的 (点) 和 * (星号) 通配符

2024-03-11

我有一个本地存储库,并试图放弃自上次提交以来的所有更改

git checkout HEAD -- *

命令。一切工作正常,即使更改是在某个子目录中。但是当我添加一些未跟踪的文件(满足中的掩码).gitignore),对存储库的根目录说“Ignored.txt”,上述命令失败并显示消息

error: pathspec 'Ignored.txt' did not match any file(s) known to git

相比之下,

git checkout HEAD -- .

按预期工作。所以我想知道:

有什么区别. and *git 中的通配符?


The major区别根本不在于 Git。

因为它不在 Git 中,所以是否有什么区别,如果有的话,what差异取决于您使用的非 Git 命令解释器。

Shell 与 Git

在 Unix-ish 系统(包括 Linux)上,它是命令解释器(或“壳”)可扩展*为你。各种外壳,例如bash and zsh and fish and tcsh and dash等等(其中大多数的名字以sh), 解释*意思是“当前工作目录中的大多数文件”。这种扩展称为globbing https://en.wikipedia.org/wiki/Glob_(programming).

这些贝壳do not解释和扩展.以任何方式。这意味着:

git xyzzy -- .

invokes git具有三个参数,xyzzy, --, and .. But:

git xyzzy -- *

invokes git例如,有七个参数:xyzy, --, a, b, c, d, e,如果有名为a, b, c, d, and e在当前工作目录中。

Git 不太使用工作目录

Git 主要感兴趣的是commits,存储在存储库中。建造new提交,Git 使用它的index,也存储在存储库中。索引实际上以一种特殊的、仅限 Git 的压缩格式保存文件——与提交中的内容基本相同。

文件的索引副本是可写的,而任何文件的提交副本都是只读的。 (从技术上讲,Git 只是保留objects在其主对象数据库中,索引和提交副本都只是对这些对象的引用。您不能覆盖任何对象,但可以添加一个new对象并切换索引引用;您无法更改提交的引用。效果是提交中的文件被冻结,而索引中的文件被解冻/可写。)

这种仅限 Git 的内部文件格式对您(用户)和计算机上的大多数程序都没有用。所以这些文件have待扩大。它们会扩展到您的工作树,它位于可能具有子目录(子文件夹)的目录(或文件夹)中。您可以设置您的当前工作目录到任何这些工作树目录。然后外壳会膨胀*到工作树中当前目录中找到的文件的名称。

Git 主要使用您当前的工作目录来查找存储库数据库,Git 的真实文件位于其中。工作树副本仅供您随意摆弄。

一些 Git 命令确实使用工作树

当然,git checkout and git add两者都以各种方式使用工作树。但请注意,由于工作树是用于your使用,您可以将文件放入其中不存在在存储库本身中。

文件可以位于您的工作树中,但不能位于索引中。 (实际上,索引位于工作树和存储库“之间”,并为 Git 提供了一个存储将进入工作树的文件的位置。next提交。)处于这种状态的文件(在您的工作树中,但不在索引中)被认为是未追踪的.

Git 本质上不知道未跟踪的文件。但它们位于您的工作树中(根据定义),因此如果这也是您当前的工作目录,并且您使用*并让 shell 展开*对于这些文件名,您将向 Git 传递一个它当前不知道的文件名。

如果您使用的命令是git add,你会告诉 Git:将此文件从工作树复制到索引中。这将在索引中创建该文件,以便它现在将位于您进行的下一次提交中。 Git 对此很满意!

但如果你使用的命令是git checkout,你会告诉 Git:将此文件从索引复制到工作树中。Git 不会在索引中找到该文件,因此它会抱怨。 (它不会触及工作树中的文件。)

请注意,未跟踪的文件也可以(但不一定)ignored(这不是一个很好的术语,但它是 Git 使用的术语)。您可以通过在名为 的文件中列出文件名或名称模式来告诉 Git 不要抱怨未跟踪的文件.gitignore。在这种情况下,git add会警告您忽略未跟踪和忽略的文件:Git 不会将该文件复制到索引中,即使您使用git add *.

Git does知道关于.

如果你使用git add . or git checkout -- .,外壳根本不膨胀。 Git 看到.并知道这意味着“当前工作目录”,因此如果合适的话,例如,对于git add—Git 将读取当前工作目录。它可以将在那里找到的文件与索引中已有的文件进行比较,并知道如何更新它们git add,包括not添加 (1) 未跟踪和 (2) 中列出的文件.gitignore。 (文件是已经在根据定义,索引不会被忽略,因此它们也会从工作树更新到索引中。)

With git checkout -- .,Git 直接查看索引,根本看不到未跟踪的文件。

特殊情况:“点文件”、根本没有文件和 CMD.EXE

上面的情况相当简单,但有几个特殊情况使它变得复杂:

  • 大多数贝壳do not匹配点文件(例如.profile or .gitignore) 展开时*。所以,如果你有文件.gitattributes and .gitignore在当前目录中,并使用git checkout -- *,您可能不会将这些文件的索引版本复制到工作树中。

  • 如果当前目录中根本没有文件,或者没有与 glob 模式匹配的文件,例如*.asdf,一些 shell 抱怨并中止命令,但其他 shell 只是传递模式 -*.asdf甚至*—转到您正在运行的程序。

  • DOS 风格的 CMD.EXE 不扩展*.

对于后两种情况,Git 本身does看到*. Now Git有机会进行全局扩展,对于 Git 来说,Gitdoes match .- 像这样的文件.gitattributes and .gitignore。所以如果当前工作目录有没有非点文件,但确实有.gitattributes and .gitignore,然后你运行:

git checkout -- *

那么在这种特殊情况下,Git 将复制.gitattributes and .gitignore从索引到工作树。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

之间的区别。 git 中的 (点) 和 * (星号) 通配符 的相关文章

  • 有谁知道类似于 SVN Time-Lapse View 的 Git 工具 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 SVN Time Lapse View 是一个跨平台查看器 可以下载文件的所有修订版本 并允许您通过拖
  • 有没有办法让 git flow 显示它在幕后执行的命令?

    有什么方法可以让 git flow 提前告诉我当我执行 flow 命令时它将执行的确切 git 命令吗 或者告诉我它是东吗 我只能看到输出和摘要吗 你可以使用Git的GIT TRACE 环境变量 http git scm com docs
  • 哪个是更智能的 git 协议,ssh 或 git(通过 ssh)或 https 协议?

    哪个高效 SSH 或 Git 文件压缩 我对 Git 的理解是 git 协议很智能 因为通信两端都有一个协议代理来压缩文件传输 从而通过有效地使用网络带宽来实现更快的克隆 From 我发现了以下说法 For secure authentic
  • git 显示已添加到 gitignore 的文件中的更改?

    我已经将 log2 文件夹和 main js 文件添加到 gitignore 如屏幕截图所示 但即使执行后git rm cached r我仍然可以看到 git 正在检测 main js 和 log2 文件夹内文件的更改 怎么会 这些的常见问
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • 格里特:! [远程拒绝] HEAD -> refs/publish/master (没有新的更改)

    我做了一些更改 提交了它们并将分支推送到 Gerrit git push gerrit 现在我的更改没有出现在 Gerrit 中 我认为这是因为我手动推送更改而不是使用git 审查 https github com openstack in
  • 致命:.git/info/refs 无效:这是一个 git 存储库吗?

    我有一个托管在 Assembla 上的 Git 存储库 我正在尝试执行以下操作 git push u origin master 我一遍又一遍地收到以下错误 fatal https url repo name git info refs n
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 我可以直接从我的谷歌云端硬盘在线推送/拉取吗?

    有一些方法可以通过谷歌驱动器同步 Windows 应用程序将我的本地 git 存储库同步到我的谷歌驱动器 但我想知道我是否可以完全绕过它的需要 Fro eg git remote add origin https drive google
  • 使用终端时 Git 推送在总计后卡住了?

    我尝试将一些文件推送到Github 总大小只有22 2M 我不知道为什么它在总行之后卡住了 我读过推送到 Github 时 Git 推送挂起 https stackoverflow com questions 16906161 git pu
  • git 认为文件已更改

    我在一台机器上对一个项目做了一些工作 然后推送到 github 在另一台机器上克隆并做了一些工作 然后推送 然后我回到第一台机器并做了一个pull 现在 第一台机器认为项目中最初的所有文件都已更改 我试过了 git checkout f a
  • 创建一个空分支?

    我有一个包含项目的 git 存储库 我现在要对这个项目进行大规模的修改 如何为这次大修创建一个空白的新分支 然后当完成时 如何将这个分支切换到master 使用 checkout orphan 命令 git checkout orphan
  • 将bitbucket发布到数字海洋

    我本质上是试图使用 bitbucket 来理解 git 的概念 我一直在通过修改本地帐户和 bitbucket 帐户之间的文件来练习版本控制 事实证明这很有帮助 现在我正在尝试弄清楚如何将文件从 bitbucket 或者我猜是 GitHub
  • Android 存储库初始化失败

    我想我非常仔细地遵循该网站的说明 http source android com source downloading html http source android com source downloading html 但是当我尝试这
  • 如何让 Aptana Studio 记住 git ssh 密码

    我找不到任何有关如何获得 Aptana Studio 的内置 git 支持来记住执行推 拉操作的 ssh 密码的指南 信息 有人有什么想法吗 Aptana Studio 实际上是内置的 GIT 程序 它将在 Windows 上的 C Use
  • 如何在不在存储库中的情况下执行 Git 命令?

    有没有一种方法可以在不位于存储库的情况下对存储库执行 Git 命令 例如这样的事情 git home repo log 请不要告诉我cd到它 我正在通过一个exec call Use C作为 git 的第一个参数 git C home re
  • Git - 远程:错误:无法运行钩子/后接收:没有这样的文件或目录

    我收到错误 remote error cannot run hooks post receive No such file or directory 当尝试推送到远程时 接收后文件存在于正确的位置 testnew git hooks 并包含
  • 无法使用 Git 部署从多项目解决方案部署正确的网站到 Azure

    我有一个解决方案 它有一个 mvc 网站 WebApplication1 该网站依赖于解决方案中的另一个项目 WebAppCore 源代码托管在 Visual Studio Online 上的 git 中 我配置了持续集成 一切都构建得很好
  • 如何创建名称中带有正斜杠的标签

    当我已经有了类似的标签时 有什么方法可以创建名称中带有正斜杠的 git 标签吗 假设我有 1 16 0 标签 并且我想创建 1 16 0 1 0 0 标签 git tag 1 16 0 1 0 0 error refs tags 1 16
  • 为 RHEL 6 安装/构建 git-svn

    我无权访问 RHEL6 存储库 那么在 RedHat Enterprise Linux 6 上构建和 或安装 git svn 工具的最佳方法是什么 通过卸载现有的 yum擦除git 并从源安装最新的来设法安装git和git svn 1 7

随机推荐