我希望在将文件添加到Git索引之前自动进行格式化。目前,我有一个类似于以下内容的pre-commit hook:
#!/bin/bash
set -e
exec 1>&2
workingext="working.$$"
ext="bak.$$"
git diff -z --cached --name-only | egrep -z '\.(pl|pm|t)$' | \
while read -d'' -r f; do
# First modify the file in the index
mv "$f" "$f.$workingext"
git show :"$f" > "$f"
perl -c "$f"
perltidy -pbp -nst -b -bext="$ext" "$f";
rm -f "$f.$ext"
git add "$f"
mv "$f.$workingext" "$f"
# Then the working copy
perl -c "$f"
perltidy -pbp -nst -b -bext="$ext" "$f";
rm -f "$f.$ext"
done
基本上,我会备份工作副本,检查索引副本,格式化它们,将它们添加到索引中,然后恢复工作副本并对其进行格式化,以便工作副本和索引副本之间的差异不会变得太大。我首先使用
perl -c
检查文件的语法,以使格式化工具perltidy
不会被语法错误的文件搞糊涂。到目前为止,这似乎运作得相当顺利。但是,我想知道是否有一种方法可以将一个文件的内容添加到以另一个文件的名称命名的索引中。也就是说,像
git update-index-from-file --from-file foo.pl.tmp foo.pl
这样的命令将更新文件foo.pl
,使其在索引中的内容完全来自foo.pl.tmp
,但其工作目录中的版本保持不变。这可能会避免我现在正在做的重命名操作(尽管这可能有助于确保我不会无法检索地丢失索引的内容)。
git config
,因此每个检出代码的用户都需要重新配置过滤器。 - Eyal