我正在和我的团队一起使用Git,并希望从我的差异、日志、合并等中删除空白更改。我假设做到这一点最简单的方法是Git在应用所有提交时自动删除尾随空白(和其他空白错误)。
我已经尝试将以下内容添加到~/。gitconfig文件,但是当我提交时它什么也不做。也许它是为别的东西设计的。解决方案是什么?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
我使用Ruby,以防有人对Ruby有任何具体的想法。在提交之前自动格式化代码将是下一步,但这是一个困难的问题,并不是真正造成大问题。
同样的结果。
import subprocess
def get_trailing_lines():
result = subprocess.run([
'git',
'diff',
'--check'
], capture_output=True)
return result.stdout.decode().split('\n')
def modify_line(file_path, l_num):
f_lines = open(file_path).readlines()
f_lines[l_num] = f_lines[l_num].rstrip()+'\n'\
if '\n' in f_lines[l_num] else f_lines[l_num].rstrip()
with open(file_path, "w") as w_fp:
w_fp.writelines(f_lines)
if __name__ == '__main__':
l = get_trailing_lines()
for m, d in zip(l[::2], l[1::2]):
f_path, l_no, *_ = m.split(":")
modify_line(f_path, int(l_no)-1)
这些设置(核心。空格和apply.whitespace)不是用来移除尾随空格的,而是用来:
核心。空格:检测它们,并引发错误
适用。空格:并删除它们,但只在补丁期间,而不是“总是自动”
我相信git钩子预提交会做得更好(包括删除尾随空格)
注意,在任何给定的时间,你都可以选择不运行pre-commit钩子:
暂时:git提交——no-verify。
CD .git/hooks/;Chmod -x预提交
警告:默认情况下,预提交脚本(就像这个脚本)没有“移除尾随”功能,而是“警告”功能,比如:
if (/\s$/) {
bad_line("trailing whitespace", $_);
}
然而,你可以构建一个更好的预提交钩子,特别是当你考虑到:
在Git中提交时,只向暂存区添加了一些更改,仍然会导致“原子”修订,该修订可能从未作为工作副本存在过,也可能无法工作。
例如,oldman在另一个答案中提出了一个预提交钩子,它可以检测并删除空白。
由于该钩子获取每个文件的文件名,我建议对某些类型的文件要小心:你不希望删除.md (markdown)文件中的尾随空格!
hakre在评论中建议的另一种方法是:
你可以在markdown中在行末有两个空格,而不是在\n前添加“\”作为尾随空格。
然后是内容过滤器驱动程序:
git config --global filter.space-removal-at-eol.clean 'sed -e "s/ \+$//"'
# register in .gitattributes
*.md filter=space-removal-at-eol