4

IM 编写了一个简单的 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 中设置输出。如果预提交仅尝试运行 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 并设置变量,当我从控制台运行预提交时,它可以工作?

4

2 回答 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
于 2014-03-26T13:23:35.563 回答
1

我认为你需要git diff通过使用来反对即将提交的内容--cached

FICHEROS=`git diff --cached --name-only`
于 2014-03-26T12:55:50.767 回答