使用Git属性,并使用Git配置设置过滤器
好的,这是解决这个问题的一个新方法……我的方法是不使用任何钩子,而是使用过滤器和Git属性。这允许您在开发的每台机器上设置一组过滤器,这些过滤器将在提交文件之前去除额外的尾随空白和额外的空行。
然后设置一个.gitattributes文件,说明过滤器应该应用于哪种类型的文件。过滤器有两个阶段,在将文件添加到索引时应用clean,在将文件添加到工作目录时应用smudge。
告诉Git查找全局属性文件
首先,告诉全局配置使用全局属性文件:
git config --global core.attributesfile ~/.gitattributes_global
创建全局过滤器
现在,创建过滤器:
git config --global filter.fix-eol-eof.clean fixup-eol-eof %f
git config --global filter.fix-eol-eof.smudge cat
git config --global filter.fix-eol-eof.required true
添加sed脚本魔法
最后,将fixup-eol-eof脚本放在路径中的某个位置,并使其可执行。该脚本使用sed执行一些动态编辑(删除行尾的空格和空格,以及文件末尾无关的空行)。
fix -eol-eof应该是这样的:
#!/bin/bash
sed -e 's/[ ]*$//' -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1
我的要点是
告诉Git将新创建的过滤器应用于哪些文件类型
最后,创建或打开文件~/。在你最喜欢的文本编辑器中添加Gitattributes_global,并添加如下行:
pattern attr1 [attr2 [attr3 […]]]
所以如果我们想要修复空白的问题,对于我们所有的C源文件,我们将添加一行,看起来像这样:
*.c filter=fix-eol-eof
滤波器的讨论
过滤器有两个阶段。当东西被添加到索引或签入时应用的清洁阶段,以及当Git将东西放入工作目录时应用的涂抹阶段。
在这里,我们的smudge只是通过cat命令运行内容,这应该使它们保持不变,除了可能添加一个尾随换行符(如果文件末尾没有换行符的话)。
The clean command is the white space filtering which I cobbled together from notes at http://sed.sourceforge.net/sed1line.txt. It seems that it must be put into a shell script. I couldn’t figure out how to inject the sed command, including the sanitation of the extraneous extra lines at the end of the file directly into the git-config file. (You can get rid of trailing blanks, however, without the need of a separate sed script. Just set the filter.fix-eol-eof to something like sed 's/[ \t]*$//' %f where the \t is an actual tab, by pressing Tab.)
如果出现错误,require = true会引发一个错误,以避免遇到麻烦。