能否为git add --patch添加自定义选项处理换行符转换?
解决git add --patch中换行符转换的实时处理问题
我之前维护跨平台项目时也碰到过一模一样的麻烦——IDE自动转换行符导致git diff全文件标红,中断patch流程去手动转格式太浪费时间。这里有几个实用方案,从临时应急到一劳永逸解决都覆盖到了:
一、用git内置功能实时转换(最快应急)
git add --patch的交互界面其实自带执行外部命令的能力,完全不用中断当前流程:
- 当看到某个文件因换行符问题显示全文件变更时,别选
y/n/q这类常规选项,直接按**!键**(感叹号) - 终端会提示输入要执行的命令,直接输入:
unix2dos %f- 这里的
%f是git的内置占位符,会自动替换成当前选中的文件名
- 这里的
- 执行完命令按回车回到patch界面,此时文件已经转成DOS换行符,git会重新计算diff,你就能正常选择要stage的变更了
这个方法零配置,临时处理这类问题效率最高。
二、自定义快捷命令(简化重复操作)
如果你经常需要做这个转换,可以给git加个自定义别名来简化命令:
- 编辑你的
~/.gitconfig文件,添加以下内容:[alias] fixdos = !unix2dos "$1" - 之后在patch界面按
!键时,直接输入git fixdos %f就行,比每次敲完整的unix2dos %f更顺手。
三、从根源解决换行符问题(一劳永逸)
与其每次patch都临时处理,不如让git和IDE统一换行符规则:
- 配置IDE禁用自动转换:比如PHPStorm中,你可以在
Settings > Editor > Code Style > Line Separators里,把默认换行符改成CRLF(DOS),或者针对当前项目单独设置,这样编辑时就不会自动转成Unix换行符了。 - 用git属性文件强制统一换行符:在项目根目录创建
.gitattributes文件,添加:
这样git会自动把所有文本文件的换行符统一为CRLF,不管你在什么平台编辑,commit和checkout时都会保持一致,从根源避免换行符导致的全文件diff。* text eol=crlf - 让git忽略换行符差异:如果只是不想在diff里看到换行符变更,可以执行:
这样git diff会忽略行尾CR(DOS)和LF(Unix)的差异,只显示真正的内容变更。git config core.whitespace cr-at-eol
内容的提问来源于stack exchange,提问作者Philipp Wrann
相关产品推荐
相关产品推荐

