我的git预提交挂钩未执行Astyle,也没有设置变量。为什么?

4

我正在编写一个简单的Git pre-commit钩子,在将要提交的文件中运行Astyle(一种代码美化工具)。以下是代码:

#!/bin/sh
echo "git diff:" 
FICHEROS=`git diff --name-only`
if [ -z "${FICHEROS}" ]; then
  echo "Files not found"
else
  echo "files are:"
  echo "$FICHEROS" 
  cp $FICHEROS ${FICHEROS}_copy
  echo "Running astyle"
  /home/robgon/astyle/build/gcc/bin/astyle --indent=force-tab --pad-oper --pad-paren --delete-empty-lines --suffix=none --indent-namespaces --indent-col1-comments -n ${FICHEROS}_copy
  echo "Formatted"
fi

当我尝试使用git commit -a -m "test1"提交一个名为"file1.c"的文件时,控制台会显示以下内容:

git diff:
Files not found
[master d3d2526] test1
 1 file changed, 1 insertion(+), 1 deletion(-)

因此,git diff --name-only没有将输出设置为FICHEROS。如果pre-commit只尝试运行astyle,则脚本将跳过输出并且不会格式化文件...
如果我从控制台运行.git/hooks/pre-commit,我会得到:
git diff:
files are:
file1.c
Running astyle
Formato     /home/robgon/gitTuto/gitRepo1/proj/file1.c_copy
Formatted

为什么Git无法在pre-commit脚本中执行astyle和设置变量,但是当我从控制台运行pre-commit时,它可以正常工作?
2个回答

2
这是新的脚本,现在可以运行:
!/bin/sh
echo `git status`
echo "git diff:" 
FICHEROS=`git diff --cached --name-only`
if [ -z "${FICHEROS}" ]; then
  echo "Files not found"
else
  echo "files are:"
  echo "$FICHEROS" 
  cp $FICHEROS ${FICHEROS}_copy
  echo "Running astyle"
  /home/robgon/astyle/build/gcc/bin/astyle --indent=force-tab --pad-oper --pad-paren --delete-empty-lines --suffix=none --indent-namespaces --indent-col1-comments -n ${FICHEROS}_copy
  echo "Formatted"
fi

1

我认为你需要使用--cached对即将提交的内容执行git diff命令:

FICHEROS=`git diff --cached --name-only`

如果我运行 git diff --cached --name-only,控制台没有任何输出(在我的控制台中运行此命令)。脚本也会抛出相同的输出。:( - RGonza
如果在钩子脚本中运行 git status 会发生什么? - John Zwinck
如果我在脚本开头运行git status,它就可以工作!谢谢你!我需要调查为什么我需要运行git status才能运行git diff。我是Git的新手。 - RGonza
我很确定运行git status并没有真正解决它。无论如何,祝你好运! - John Zwinck
也许还有其他更改可以修复设置变量和运行astyle的问题。这是完整的脚本(它只是一个示例脚本,在提交文件之前格式化文件)。 - RGonza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接