【问题标题】:git staged commit with invalid file name带有无效文件名的 git 暂存提交
【发布时间】:2023-02-03 01:25:14
【问题描述】:

我正在按照指南确保您的 JavaScript 和 CSS 文件在您通过添加更新时始终刷新?v=到文件名。但是 Windows 和 git 不喜欢这种命名约定,但我确实设法命名了文件审计.cssaudit.css?v=1.0使用Cygwin.然而作为混帐不喜欢这个文件名,它卡在要提交的更改中。我怎样才能删除删除改变这个文件?我已经尝试对 stackoverflow 上的其他页面进行一些更改,但都失败了。

Cygwin$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    audit.css?v=1.0 -> audit.css

Cygwin$ git restore --staged audit.css
Cygwin$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    audit.css?v=1.0

Cygwin$ git restore --staged audit.css?v=1.0
error: invalid path 'audit.css?v=1.0'

Cygwin$ git reset 'audit.css?v=1.0'
error: invalid path 'audit.css?v=1.0'
fatal: make_cache_entry failed for path 'audit.css?v=1.0'

【问题讨论】:

    标签: git


    【解决方案1】:

    我没有测试系统,但您可以更加严厉地删除本地更改

    请注意这两个都会丢弃状态,因此请谨慎对待您想要保留的任何其他并行更改

    放弃本地更改

    git checkout -- .  # <-- note .
    

    放弃对 HEAD 的任何更改

    git reset --hard
    

    【讨论】:

    • 感谢这些命令。我确实对其他我没有提交但想保留的文件进行了更改 - git checkout 看起来会丢弃这些更改。我想我应该在尝试进行任何我不熟悉的更改(如 git mv)之前提交更改。
    • 可能 - 虽然这是第一次提到 git mv!你能用它撤销改变吗?
    【解决方案2】:

    由于您没有向远程分支(在 github 中)提交任何内容,您可以像这样回滚您的更改

    git reset --hard HEAD

    这样做是删除你上次推送到远程仓库时的所有更改(即你最后一次 git push)


    另一种方法是您可以通过文件资源管理器更改文件。如果您打开文件并看到它,请右键单击,重命名为新名称。但是,这可能不起作用,因为您之前将文件扩展名更改为“.css?v=1.0”,这可能会损坏您的文件。

    • 根据经验,扩展名是计算机知道文件类型的一种方式,您不应该在“.”之后更改任何内容。
    • 另一个规则是不要用特殊字符或空格命名文件。它会导致很多路径问题和跨应用程序的兼容性问题

    另一种方法是直接删除文件并重新从头开始该文件。 您可以使用文件资源管理器删除文件或在命令行中使用此命令

    转到文件的位置

    rm audit.css?v=1.0

    【讨论】:

    • 感谢您的建议。我已经能够删除文件 audit.css?v=1.0 所以现在只存在 audit.css。然而git似乎还保留着audit.css?v=1.0文件的记忆,不愿放手。
    • 我猜“git 仍然保留内存”意味着您之前已将其添加到提交中(您执行了 git add audit.css?v=1.0)。 A (git checkout -- audit.css?v=1.0) 应该可以从暂存中移除。如果这不起作用,您可以通过从云中拉入它来在新位置启动存储库(即,转到一个全新的位置,例如 Documents/anotherFolder,然后执行 git clone repoName)。那不会有任何旧的分阶段提交的记忆
    • 您的建议解决了问题。我执行了 git checkout 然后能够执行 git commit。
    【解决方案3】:

    你误解了指南。

    它告诉你添加那个到你的网址, 在文件名的末尾。文件名仍应为audit.css

    在所有的文本处理过程中,都在进行一些小动作。它经过精心编排和调整......哇,现在字面上的几代人,尽可能不打扰,但你刚刚被兔子沃伦的一个条目绊倒了。

    如果你有动力,here's the start of the particular rabbit hole you fell in to。搜索问号或开始阅读。该文件告诉你你的 url 是如何被解析的,以及一些应该用这些部分完成的事情。

    引用的文件还是打算audit.css;您的服务器和任何浏览器之间的网络缓存应该记住整个缓存的 url,但您的服务器应该解释 ? 以及随后的带有参数的查询,有时可以,这里应该被忽略。因此,如果您更改 ?v= 查询,缓存将发现它与他们缓存的内容不匹配,并将请求传递给您的服务器,如果您想在此使用中保持理智,您已经设置为忽略那个特定的查询。

    【讨论】:

    • 感谢您的解释。我错误地假设磁盘上的文件必须与 html 中的文件同名。但是,您是说将 ?v 添加到 URL 的末尾会告诉浏览器始终从服务器下载文件的新副本,即不要使用缓存的文件。
    • 它不完全是那样的。我确实说过兔子洞。添加查询可让您在不更改文件名的情况下更改 url。改变该 url 使中间缓存无法识别它们已缓存内容。如果他们正在缓存,一旦他们看到为新 url 交付的内容,他们将保存它并再次提供它,直到您再次更改 url。
    【解决方案4】:

    Windows 操作系统与该文件命名约定不兼容。

    Windows 文件名不能包含 " * / : &lt; &gt; ? |。见this question

    1. 更简单:将 git 操作移至 Windows Subsystem for Linux (WSL)。您可以通过 Microsoft Store 安装它,IIRC 它只是称为“Ubuntu”。

      WSL 没有与 Windows 相同的文件名限制。 WSL 通过在别处记录 Linux 文件名来实现这一点,允许 Linux “认为”它已经摆脱了向文件名添加 Windows 限制字符的麻烦。

      1. 更难:安装适用于 Windows 的 Docker Desktop 并将其用于 git 操作。

      这可能不起作用,因为如果读取/写入文件的软件仍可能需要在 Windows 上运行(例如 IDE),则适用相同的文件名限制。

      1. 取消 ?v= 文件名后缀。

      这听起来像是版本控制的误用。 ?v=... 约定对我来说就像是您在 HTML 中放入 defeat the cache via URL parameters 的字符串。让 HTML 包含 ?v=... 字符串并让 Web 服务器忽略它们可能会更好。

    【讨论】:

    • 谢谢您的帮助。我误解了 JavaScript 和 CSS 文件的缓存失效指南。当 Windows 反对 ?在文件名中。
    猜你喜欢
    • 2019-05-06
    • 2020-07-18
    • 2012-08-26
    • 2015-01-09
    • 2021-03-26
    • 2015-09-11
    • 2014-08-01
    • 2016-07-05
    • 2014-04-03
    相关资源
    最近更新 更多