小能豆

`git diff` 不适用于从 Git LFS 中排除的文件

git

我们的存储库 ( https://github.com/code-dot-org/code-dot-org ) 最近已转换为使用 Git LFS。我们在 Git 中有大型静态 Web 目录,这无疑不是一个很好的模式。我们的方法是将这些大型目录包含在 LFS 中,然后排除其中某些“已知为文本”的文件类型。

以下是此方法的示例.gitattributes

pegasus/sites.v3/** filter=lfs diff=lfs merge=lfs -text # include dir in LFS
pegasus/sites.v3/**/*.haml !text -filter -merge -diff # exclude *.haml from LFS

但是,git diff排除项的表现并不符合预期,假设我修改了pegasus/sites.v3/hourofcode.com/views/front_join_us.haml. 这是由 dir 模式包含的,但随后被更具体的文件扩展名模式排除,但是当尝试获取 时git diff,它声称该文件是二进制文件并且不会比较它们:

diff --git a/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml b/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml
index aaf209c98be..2de745be618 100644
Binary files a/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml and b/pegasus/sites.v3/hourofcode.com/views/front_join_us.haml differ

此外,它不会自动合并文件。神秘的是一些工具,比如 VSCode,可以正确地比较这个文件。

我已经确认front_join_us.hamlLFS 没有跟踪:

git lfs ls-files | grep front_join_us.haml # returns nothing

阅读 221

收藏
2024-02-14

共1个答案

小能豆

根据您提供的信息,看起来您的 .gitattributes 文件配置正确,但是 git diff 不会按预期工作。在这种情况下,您可以尝试以下几种方法来解决问题:

  1. 手动解决冲突:虽然 git diff 不会按预期工作,但您仍然可以手动解决冲突。这意味着您需要检查变更并手动将它们应用到正确的文件版本中。
  2. 使用其他工具进行比较和合并:您已经提到了一些工具(如VSCode)可以正确比较文件。您可以尝试使用这些工具来执行比较和合并操作,而不是依赖于 git diffgit merge
  3. 更新 Git 版本:某些情况下,Git 版本可能会影响其行为。尝试将 Git 更新到最新版本,看看是否解决了问题。
  4. 尝试重新配置 .gitattributes:有时候,重新配置 .gitattributes 可能会解决问题。您可以尝试调整排除模式或重新组织文件以更好地与 LFS 集成。
  5. 检查 Git LFS 配置:确保您的 Git LFS 配置正确,并且 LFS 跟踪没有遗漏任何文件。
  6. 咨询 Git 社区或支持:如果以上方法都无法解决问题,您可以尝试向 Git 社区或支持寻求帮助。他们可能会提供更具体的解决方案或建议。

综上所述,这些是您可以尝试解决 git diffgit merge 不按预期工作的一些方法。根据您的情况和喜好,选择最适合您的方法。

2024-02-14