2014-03-26 28 views
3

IM寫了一個簡單的git pre-commit hook來運行要提交的文件中的Astyle(代碼美化器)。下面是代碼:我的git pre-commit hook沒有執行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 

當我嘗試提交文件,名爲「file1.c中」與git的承諾-a -m「測試1」,例如,我在控制檯中:

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

所以,git diff --name-only沒有在FICHEROS中設置輸出。如果預提交只嘗試運行的astyle,腳本跳過輸出和犯規格式化文件...

如果我運行的.git /鉤/從我的控制檯前的承諾,我得到:

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

爲什麼git不能執行astyle並在預提交腳本中設置變量,並且當我從控制檯運行預提交時,它的工作原理?

回答

1

我認爲你需要做git diff針對的是即將被使用--cached承諾:

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

如果我跑git的差異--cached --name-only,我沒有任何輸出在控制檯(在我自己的控制檯中運行這個命令)。腳本引發相同的輸出。 :( – RGonza

+0

如果我在腳本的開頭運行git status,它會在鉤子腳本中運行'git status'? –

+0

!!謝謝!我需要調查爲什麼我需要git狀態來運行git diff後來我在Git的一個新手 – RGonza

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 
相關問題