如何忽略/恢复文件内容中大小写的更改?

sla*_*dan 7 git bash case-insensitive git-bash

我正在对 Microsoft Access VBA 代码进行版本控制,该代码通常不区分大小写。然而,变量名的情况在那时(由 Access 编译器或由开发人员)时不时地发生。这通常会导致我的 git 工作区发生巨大变化。

如何还原或忽略仅涉及文件内容大写或小写的更改?

一个例子:

git init
echo "public sub example()\nend sub" > mdlExample.ACM
#                ^-- lower e
git add --all
git commit --all --message "Initial Commit"
echo "public sub Example()\nend sub" > mdlExample.ACM
#                ^-- upper E
Run Code Online (Sandbox Code Playgroud)

我会喜欢这样的东西:

git restore --only-case-changes # not working
Run Code Online (Sandbox Code Playgroud)

进而:

git status
> On branch master
> nothing to commit, working tree clean
Run Code Online (Sandbox Code Playgroud)

jth*_*ill 5

考虑更改example="example"Example="Example". 您如何建议 Git 决定在此处忽略哪个案例更改?现在考虑注释中的代码片段,或存储为代码生成器的字符串。我开始希望 Git 摆脱烦人的琐事,但我认为如果你试着想象一下告诉 Git 你想要什么,你会更好地理解你的问题的上下文。

如何还原或忽略更改,仅涉及文件内容的大写或小写

当您想暂时忽略更改时,当您想在没有看到这些更改的情况下进行差异或责备时,您可以使用“textconv”过滤器来规范化您差异的文本。我使用这些来做一些事情,比如在差异时从生成的 html 中去除嵌入的时间戳,最快的 atm 是

[diff "doc-html"]
    textconv = "sed  's,<span class=\"version\">Factorio [0-9.]*</span>,,;s,<[^/>][^>]*>,\\n&,g'"
    wordRegex = "<[^>]*\\>|[^< \\t\\n]*"
Run Code Online (Sandbox Code Playgroud)

.git/config,和

doc-html/*.html diff=doc-html
*.cfg -diff
Run Code Online (Sandbox Code Playgroud)

.git/info/attributes

所以我改变了什么差异不会向我展示我不关心的东西。

如果您想查看差异忽略大小写的结果,请尝试

[diff "nocase"]
        textconv="tr A-Z a-z"
Run Code Online (Sandbox Code Playgroud)

并将* diff=nocase(或可能*.vba diff=nocase)放入.git/info/attributes. 完成后,将其取出。

但是对于合并,我的引导示例应该让您相信 Git 自动且静默地在 repo 内容中进行大小写更改,即使只是在看起来像标识符的文本中,也是一个坏主意。当发生冲突时,不仅仅是片面的变化,而是两种不同的变化,仍然需要一些人为判断来决定结果应该是什么。幸运的是,使用任何不错的合并工具,解决简单的冲突都在亚秒范围内。


Von*_*onC 4

您不需要做git restore任何事情:您可以设置一个干净的内容过滤器驱动程序,如下所示,它将自动将这些情况转换为git diff/ git commit
这意味着:

  • 你甚至不会看到有差异
  • 由于该内容过滤器驱动程序,您不会添加/提交任何内容。

https://git-scm.com/book/en/v2/images/clean.png 图片来自“ ProGit book ”的“ Keyword Expansion ”部分

这是通过以下方式完成的:

诀窍是:

您能否编写一个脚本,将 ACM 文件的内容作为输入并生成相同的 ACM 文件作为输出,但其字符串已转换?您可以在这些脚本中
包含文件名,这样您就可以进行比较并检测是否需要调整所述差异,但是您仍然需要编写正确的命令,以便在 ACM 文件中的大小写发生变化时仅替换“”字符串。xxx

注意:jthill在注释中建议设置merge.renormalize配置设置,以告诉 Git 存储库中文件的规范表示随着时间的推移而发生变化。