你如何让Git忽略空格和标签?

Com*_*ast 18 git diff indentation

我有一个小脚本项目,由一个名为"Droid XX-XX-XX"的目录中的五个不同的源文件组成.每次我创建源目录的新备份副本时,我都会将日期放在X中.因此,不同日期大约有15种不同的版本.我想从最早开始将这些中的每一个添加到我的新Git存储库中.

但是我遇到了几个问题.

  1. 一个问题是某些文件使用制表符进行缩进,而其他文件使用空格 - 但即使唯一的区别是制表符与空格问题,Git也会将整行视为不同.如何让Git忽略缩进格式?

  2. 另一个问题是某些文件名没有空格而其他文件名之间有空格 - 但Git将它们视为不同的文件.更糟糕的是,有时文件名被改为不同的东西(比如"PatrolPlan"改为"Patrol"),没有真正的理由.当我添加一组新文件时,我怎么能告诉Git即使文件名不同,它实际上只是某个旧文件的新版本?或者更好的是,我可以将其设置为在发生这种情况时自动检测吗?

  3. 最后一个问题是,在开发过程中的某些时刻,我们将两个源文件合并为一个,或者将一个文件拆分为两个 - 但是Git不会自动检测相似性并推断出发生了什么.我怎么能告诉Git发生了什么?或者更好的是,如何将两个源文件合并或拆分时自动检测?

我意识到问题(2)和(3)是高度相关的.谢谢你的帮助!

Kel*_*vin 27

听起来你需要更多的控制和标准化的开发过程.提交更改的人应该是修改文件的人.或者至少提交者应该确切地知道改变了什么.

仔细检查输出git diff,并使用-w标志忽略空格.还有一些选项可以显示一行内的差异.请参阅下面一行中的Diffs.

请注意,在提交时,您将无法告诉git跳过空格更改.我建议使用GitX(我更喜欢"兄弟"叉子),它允许你在提交之前以交互方式丢弃帅哥.

提交时使用描述性消息.例如,如果文件被拆分,请说明.让你的提交变小.如果您发现自己编写了长提交消息,请将提交分解为更小的部分.这样,当您在很长一段时间后检查日志时,它将更有意义地改变了什么.

一行内的差异

Git有能力在一行中显示"单词"差异.最简单的方法就是使用git diff --color-words.

但是,我喜欢使用diff.wordRegex配置来定制"单词"的含义.我也喜欢plainword-diff格式,因为它更清楚地显示了差异的位置(除了使用颜色外,还在变化周围插入括号).

命令:

git diff --word-diff=plain
Run Code Online (Sandbox Code Playgroud)

以及在我的配置中的这个:

[diff]
        wordRegex = [[:alnum:]_]+|[^[:alnum:]_[:space:]]+
Run Code Online (Sandbox Code Playgroud)

这个正则表达式将这些视为"单词":

  • 连续的字母数字和下划线
  • 连续的非字母数字,非下划线和非空格字符串(适用于检测运算符)

您必须拥有最新版本git才能使用wordRegex.请参见您的git-config手册页以查看是否列出了该选项.

UPDATE

如果您使用git mv重命名文件(这比使用其他工具或操作系统重命名更好),您可以看到git检测到重命名.我强烈建议在不对文件内容进行任何编辑的情况下提交重命名.那是因为git实际上并没有存储你重命名的事实 - 它使用一种启发式,根据文件的变化来猜测它是否是同一个文件.在重命名提交期间更改它越少越好.

如果您确实稍微更改了文件内容,则可以使用-Cparam git diffgit log尝试更难以检测副本和重命名.添加一个百分比(例如-C75%)以使git对差异更加宽容.百分比表示内容必须被视为匹配的相似程度.