it-swarm.com.ru

Выполнение Git-хуков в Windows

У меня проблемы с выполнением перехватов Git на Windows. У меня есть репозиторий, и в его папке «hooks» я поместил следующее в файлы «update» и «pre-Push», но скрипт PHP никогда не выполняется:

"c:/Programs/PHP/php.exe" c:/Data/Scripts/git-pre-Push.phpcli %1

Есть идеи, почему сценарий PHP не выполняется?

В окне консоли Git я вижу следующее, когда пытаюсь что-то перенести в репозиторий:

POST git-receive-pack (437 bytes)
remote: error: hook declined to update refs/heads/master
To https://[email protected]/samplerepo
! [remote rejected] master -> master (hook declined)
error: failed to Push some refs to 'https://[email protected]/samplerepo'

... так что я знаю, что "обновление" каким-то образом выполняется. Когда я удаляю этот файл, Push работает просто отлично.

12
TheStoryCoder

По умолчанию Git для Windows выполняет скрипты-ловушки, используя свой собственный порт Windows оболочки bash. Конечно, Unix Shell не имеет представления о %1. Предположительно, Git для Windows имеет дополнительные хаки для обнаружения «общих» расширений имен файлов, таких как .bat, и в этом случае использует альтернативный маршрут.

Я думаю, что ваше исправление к вашей собственной программе является лучшим, но другой подход будет переписать ваш скрипт для чтения

#!/bin/sh
c:/Programs/PHP/php.exe c:/Data/Scripts/git-pre-Push.phpcli "[email protected]"

(Строка Шебанга в Windows не имеет никакого особого смысла, кроме намека следующему редактору сценария о значении его содержания).

14
kostix
#!/bin/sh
echo "executing pre-commit"

# Instructions:

# Put this file into your .git/hooks folder and set as executable 

 #- for Windows (attrib +x pre-commit)
 #- for ubuntu (chmod +x pre-commit)

# If you want to skip the hook just add the --no-verify: git commit --no-verify

# ---------------------------------------------

# Modify this
# LIST='list\|of\|words\|splitted\|by\|slash\|and\|pipe'
LIST="puts\|debugger;\|binding.pry\|alert(\|console.log("

if git rev-parse --verify HEAD >/dev/null 2>&1; then
    against=HEAD
else
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

for FILE in `git diff-index --name-status --cached $against -- | cut -c3-` ; do
    # Check if the file contains one of the words in LIST
    if grep -w $LIST $FILE; then
      echo $FILE." has unwanted Word. Please remove it. If you want to skip that then run git commit -m '"your comment"' --no-verify"
      exit 1
    fi
      done
exit
0
Rohit Jangid