TIL: 使用 magit 在 git add 时忽略空格改动

  • 我在 Emacs 里设置了在保存时自动删除行尾空格
  • 有些代码包含大量行尾空格
  • 我在上述代码文件里哪怕只做很小的改动,只要一保存,便会生成大量的空格改动
  • 我希望在提交代码时,忽略空格改动,只保留核心改动

稍微搜索了一下,我发现要使用 git 命令行实现上述目标,不是很容易,但使用 magit 就容易多了。步骤如下:

  1. 正常打开 magit-status,默认按键 C-x g
  2. D (magit-diff-refresh),然后按 -w,激活 --ignore-all-space
  3. g 刷新

这时,magit-status buffer 里已经隐藏了所有空格改动,放心地 add 和 commit 就好了。

1 个赞

建议去掉自动删除,改成使用 ws-butler-mode ,这样可以只删除自己修改或者新写的空格。

多人协作时候,最好少动别人的代码,省得麻烦。。。

1 个赞

第一次知道 ws-butler-mode,已经取代了 delete-trailing-whitespace。感谢推荐!

ws-butler-mode 的原理是啥?能分享下不?

这种方法有时候会导致git stage失败,到时只要关闭–ignore-all-space就行了。

没太细致看过,大体上是在文本发生修改时候给发生修改的行加上个 ws-butler-chg 的 property, 然后保 存之前遍历带有 ws-butler-chg 属性的行,逐行修正 tab, space 和行尾空格。

1 个赞

也就是说这个模块配合 auto-save 类似的插件, 可以实现自动保存, 但是仅保存用户真正动过的行?

对。字数补丁。

感谢推荐, 我试用一段时间。

说到行尾空格。能在写代码的时候,让他不生成行尾空格么?

我这里有个奇怪的现象。编辑代码的时候,比如我copy了一行,粘贴后,按C-e。光标就会跳到行尾+几个空格的位置,也就是说在行尾添加了好几个空格。

此时,一按回车进入新行,上面那行的行尾空格就没了。

如果这是没有回车进入新行。这一行的行尾空格就会持续存在。

感觉貌似和自动格式化有点关系。但不知道是什么选项在影响。

“他” 是谁。。。

通常来说不应该会有这种情况,建议用 Emacs -Q 测试一下。如果没有,说明是某处配置导致了问题,建议二分 init.el 调试一下

大概率是你复制的那行代码本身就有行尾空格。开 whitespace-mode 检查一下。

复制的没有。我怀疑是indent功能导致的。但是还没找到啥地方。