【问题标题】:Git force push files which git does not know changed?Git强制推送git不知道的文件改变了?
【发布时间】:2020-07-21 07:19:41
【问题描述】:

我一直在摆弄 PageSpeed Insights,它引导我将 Webpack 中的 css 和 js 文件压缩为 .br(用 Brotli 压缩)和 .gz(用 gzip 压缩),以便将它们提供给接受它们的浏览器。 .htaccess 做出决定。

由于 .htaccess 做出决定,我不得不使用 AddType 关闭。由于 .htaccess 不适用于多扩展名文件名,因此我必须创建一个自定义扩展名,即 cssbrcssgzjsbrjsgz。 在 .htaccess 中,它们被识别得很好:

AddEncoding gzip .jsgz .cssgz
AddType application/javascript .jsgz
AddType text/css .cssgz

AddEncoding br .jsbr .cssbr
AddType application/javascript .jsbr
AddType text/css .cssbr

这通常有效。对于无法使用压缩文件的浏览器,纯 css 和 js 也有回退。当我进行更改并使用 webpack 更新文件时,一切正常。但是当我结帐到另一个分支并合并时,git 认为我的自定义文件没有改变。 .css.js 按预期工作,但是对于 .cssbr 文件,浏览器通知我它无法解码它们 (ERROR_CONTENT_DECODEDING_FAILED)。我需要做的是再次运行 webpack 并且它可以在本地运行,但是 git 不会提交更改,因为文件似乎没有改变。 我尝试删除它们并阅读。

TL;DR:

我的自定义文件在切换分支或提交时被视为未更改。
我可以从另一个角度寻求解决方案,例如将它们更改为不同的扩展名,但是如何使 .htaccess 与它们一起使用?

.htaccess 供参考:

<IfModule mod_headers.c>
  # Serve brotli compressed CSS files if they exist and the client accepts br.
  RewriteCond %{HTTP:Accept-encoding} br
  RewriteRule ^(.*)assets/frontend/(.*)\.css $1assets/frontend/$2.cssbr [QSA,L,T=text/css,E=no-gzip:1]

  # Serve gzip compressed CSS files if they exist and the client accepts gzip.
  RewriteCond %{HTTP:Accept-encoding} gzip
  RewriteRule ^(.*)assets/frontend/(.*)\.css $1assets/frontend/$2.cssgz [QSA,L,T=text/css,E=no-gzip:1]

  # Serve brotli compressed JS files if they exist and the client accepts br.
  RewriteCond %{HTTP:Accept-encoding} br
  RewriteRule ^(.*)assets/frontend/(.*)\.js $1assets/frontend/$2.jsbr [QSA,L,T=text/javascript,E=no-gzip:1]

  # Serve gzip compressed JS files if they exist and the client accepts gzip.
  RewriteCond %{HTTP:Accept-encoding} gzip
  RewriteRule ^(.*)assets/frontend/(.*)\.js $1assets/frontend/$2.jsgz [QSA,L,T=text/javascript,E=no-gzip:1]

  # Serve correct content types, and prevent mod_deflate double gzip.
  RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
  RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]
  RewriteRule \.css\.br$ - [T=text/css,E=no-gzip:1]
  RewriteRule \.js\.br$ - [T=text/javascript,E=no-gzip:1]

  <FilesMatch "(\.js\.gz|\.css\.gz)$">
    # Serve correct encoding type.
    Header set Content-Encoding gzip
    # Force proxies to cache gzipped & non-gzipped css/js files separately.
    Header append Vary Accept-Encoding
  </FilesMatch>
  <FilesMatch "(\.js\.br|\.css\.br)$">
    # Serve correct encoding type.
    Header set Content-Encoding br
    # Force proxies to cache gzipped & non-gzipped css/js files separately.
    Header append Vary Accept-Encoding
  </FilesMatch>
</IfModule>

附加信息: 根据 PageSpeed Insights 的说法,我使用 webpack 来压缩文件,因为在服务器上这样做会增加时间并破坏使用压缩的目的

【问题讨论】:

  • 我不知道:哪些自定义文件被视为未更改?
  • 这并不是一个真正的 Git 问题:Git 从不推送 files,而只是推送 commits(是的,它包含文件,但是关键是您要么发送整个提交,要么根本不发送提交,当您发送提交时,您发送所有文件)。因此,如果文件在提交中并且您已发送提交,则它们拥有文件。如果您尚未发送提交,则他们没有提交。如果文件不在提交中,则无法发送它们。提交是快照:每个文件的完整副本。
  • 我找到了解决方案并将其发布为答案。谢谢大家。

标签: git .htaccess webpack gzip brotli


【解决方案1】:

我找到了解决方案。问题确实出在 git 中,但出在换行符上。

我在 Windows 上,所以 git 将 CRLF 更改为 LF,这会破坏文件,因为它们是二进制文件。 我需要做的是将它们作为二进制添加到.gitattributes,如下所示:

*.cssbr binary
*.cssgz binary
*.jsbr binary
*.jsgz binary

【讨论】:

  • 很好的例子表明拥有一个广泛/详尽的 gitattributes 文件可能是一个强烈的要求,并且始终是一个好主意。我猜你也有“* text=auto”??
  • @Rusi 我愿意,但我相信这是自动添加的
猜你喜欢
  • 2015-10-16
  • 1970-01-01
  • 2015-11-14
  • 2021-12-19
  • 2015-10-02
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多