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

我的git预提交钩子没有执行Astyle,也没有设置变量。为什么?,git,githooks,pre-commit,Git,Githooks,Pre Commit,我正在编写一个简单的git预提交钩子,以便在即将提交的文件中运行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

我正在编写一个简单的git预提交钩子,以便在即将提交的文件中运行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中设置输出。如果预提交只尝试运行astyle,脚本将跳过输出,并且不会格式化文件

如果从控制台运行.git/hooks/pre-commit,我会得到:

git diff:
files are:
file1.c
Running astyle
Formato     /home/robgon/gitTuto/gitRepo1/proj/file1.c_copy
Formatted

为什么git不能在预提交脚本中执行astyle和设置变量,而当我从控制台运行预提交时,它可以工作?

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

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

以下是新脚本,它现在运行:

!/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

若我只运行git diff--cached--name,那个么控制台中就并没有任何输出(在我自己的控制台中运行这个命令)。脚本将抛出相同的输出:(如果你在hook脚本中运行
git status
,会怎么样?如果我在脚本开始时运行git status,它会工作的!!谢谢!我需要调查一下为什么我以后需要git status来运行git diff。我是git的新手,我很确定运行git status并没有真正修复它。无论如何,祝你好运!也许还有其他的更改可以修复这个问题。)et Var和run astyle。这是完整的脚本(在提交之前,它只是一个在其他文件中格式化文件的示例脚本)