我试图计算作者提交给git的字符数"JohnJohnson";使用此命令:
wc -m $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)
问题是,在Linux和Windows(git-bash(上,它会产生不同的结果,至少因为在Windows上,新行由两个字符"\r\n"组成。有没有一种方法可以让wc-m忽略'\r',这样我就可以用相同的命令在两个操作系统上获得一致的结果?
注意:虽然在运行wc -m
之前对每个文件运行dos2unix
就足够了,但我假设a(dos2unix
不可用和/或b(OP可能会发现除r
之外还有其他字符需要删除。
假设目标是生成与wc -m
相同的精确输出,使用用户定义函数的一个想法是:
my_wc () {
local charcount=0 totcount=0
for fname in $@
do
charcount=$(tr -d 'r' < $fname | wc -m)
echo "$charcount $fname"
((totcount+=charcount))
done
echo "$totcount total"
}
应用于OP的例子:
my_wc $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)
如果OP找到要跳过的其他字符(除了r
(,则将它们添加到tr -d 'r'
调用中(。
另一个功能想法,但这个使用awk
:
my_wc() {
awk 'BEGIN { RS="^$" } # whole file becomes one single, long record
{ gsub("r","")
n=length($0)
tot+=n
print n,FILENAME
}
END { print tot,"total"}' $@
}
在几个示例文件上演示这些功能:
$ head f?
==> f1 <==
a 13
a 5
b 7
a 20
a 3
==> f2 <==
a 13
a 5
b 7
a 20
a 3
==> f3 <==
a 13
a 5
b 7
a 20
a 3
$ dos2unix f?
$ wc -m f?
22 f1
22 f2
22 f3
66 total
$ unix2dos f?
$ wc -m f?
27 f1
27 f2
27 f3
81 total
$ my_wc f?
22 f1
22 f2
22 f3
66 total
在配置为在工作树中不进行换行转换的repo中操作,即关闭eol
处理。您可以在任何地方进行操作,例如git config core.eol false
。避免干扰的最简单方法可能是在一个临时克隆中这样做
git clone -ns . `mktemp -d`; cd $_
git config core.eol false
git checkout
现在你得到了一个没有应用eol munging的原始结账。