我正在和我的团队一起使用Git,并希望从我的差异、日志、合并等中删除空白更改。我假设做到这一点最简单的方法是Git在应用所有提交时自动删除尾随空白(和其他空白错误)。
我已经尝试将以下内容添加到~/。gitconfig文件,但是当我提交时它什么也不做。也许它是为别的东西设计的。解决方案是什么?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
我使用Ruby,以防有人对Ruby有任何具体的想法。在提交之前自动格式化代码将是下一步,但这是一个困难的问题,并不是真正造成大问题。
在macOS(或者可能是任何BSD)上,sed命令参数必须略有不同。试试这个:
#!/bin/sh
if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -E 's/:[0-9]+:.*//' | uniq` ; do
# Fix them!
sed -i '' -E 's/[[:space:]]*$//' "$FILE"
git add "$FILE"
done
将该文件保存为.git/hooks/pre-commit——或者寻找已经存在的文件,并将底部块粘贴到其中的某个地方。还有chmod (a+x)
或者为了全局使用(通过将git post-commit钩子应用到所有当前和未来的回购中),你可以把它放在$GIT_PREFIX/git-core/templates/hooks中(其中GIT_PREFIX是/usr或/usr/local或/usr/share或/opt/local/share),并在你现有的回购中运行git init。
根据git帮助init:
在现有的存储库中运行git init是安全的。它不会覆盖已经存在的东西。重新运行git init的主要原因是获取新添加的模板。
这不会在提交前自动删除空白,但很容易实现。我把下面的Perl脚本放在一个名为Git -wsf (Git空白修复)的文件中,在$PATH目录下,所以我可以:
git wsf | sh
而且它只删除Git报告为diff的文件行中的所有空白。
#! /bin/sh
git diff --check | perl -x $0
exit
#! /usr/bin/perl
use strict;
my %stuff;
while (<>) {
if (/trailing whitespace./) {
my ($file,$line) = split(/:/);
push @{$stuff{$file}},$line;
}
}
while (my ($file, $line) = each %stuff) {
printf "ex %s <<EOT\n", $file;
for (@$line) {
printf '%ds/ *$//'."\n", $_;
}
print "wq\nEOT\n";
}
同样的结果。
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)