我一直在尝试做一个pre-commit钩子来检查索引中的文件格式是否正确。我已经尝试了很多方法,但就是不能让grep正常工作。下面是我现在的代码:
for FILE in $(git diff --cached --name-only)
do
if [[ "$FILE" =~ \.(c|h|cpp|cc)$ ]]; then
exec C:/dev/uct/clang-format-15.0.3.exe --dry-run -Werror $FILE | grep -c "violations"
fi
done
我希望它能打印出有格式问题的文件的数量(我实际上想搜索string -Wclang-format-violations,但我为了测试而简化了它)。
如果我&〉clang格式输出到一个文件中,那么违规就正确地打印到该文件中。
exec C:/dev/uct/clang-format-15.0.3.exe --dry-run -Werror $FILE &> temp.txt
如果我从命令行对该文件运行grep,它就会工作。
grep -c violations temp.txt
我还尝试从脚本对文件执行grep,但由于某种原因,也没有产生任何输出(尽管我更希望不必创建文件)。
exec C:/dev/uct/clang-format-15.0.3.exe --dry-run -Werror $FILE &> temp.txt
grep -c violations temp.txt
我做错了什么?我以为我最多半个小时就能让这个工作。
1条答案
按热度按时间bvjxkvbb1#
grep
的问题在于,您没有重定向stderr
,而只是重定向stdout
(在重定向到文件时,您也使用>&
重定向stderr)。要在管道中捕获stderr,请使用|&
。下面是一个具体的例子:
此时,索引中暂存的内容(来自第2行的
git add
)是hello
,但文件在磁盘上包含hello world
。git status
将文件同时显示为已暂存 * 和 * 已修改:如果您现在运行
git commit
,则只会提交hello
,而不会提交磁盘上存在的文件。这意味着您希望查看文件的 * 暂存内容 *--这是实际提交的内容--而不仅仅是磁盘上的文件,否则您可能会得到误报或漏报。
要处理这种情况,可以使用
git show
命令将暂存的内容传递给clang-format
(git show :filename
将输出filename
的 * staged * 内容)。试试这个: