web-dev-qa-db-ja.com

WindowsでのGitフックの実行

WindowsでGitフックを実行できません。私は裸のレポを持っており、その「フック」フォルダに「アップデート」と「プレプッシュ」ファイルの両方に次のものを入れましたが、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://myuser@mydomain/samplerepo
! [remote rejected] master -> master (hook declined)
error: failed to Push some refs to 'https://myuser@mydomain/samplerepo'

...「更新」が何らかの形で実行されていることを知っています。そのファイルを削除すると、Pushは正常に機能します。

15
TheStoryCoder

デフォルトでは、Git for Windowsはbashシェルの独自のWindowsポートを使用してフックスクリプトを実行します。確かに、Unix Shellは%1について何も知りません。おそらく、Git for Windowsは、「一般的な」ファイル名拡張子(.batなど)を検出し、そのような場合に別のルートをとるための追加のハッキングを備えていると思われます。

自分のプログラムを修正するのが最善だと思いますが、別のアプローチは、スクリプトを次のように書き直すことです。

#!/bin/sh
c:/Programs/PHP/php.exe c:/Data/Scripts/git-pre-Push.phpcli "$@"

(Shebangの行は、Windowsでは、次の人にその内容の意味についてスクリプトを編集するように示唆する以外に特別な意味はありません)。

20
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

Windowsでは、通常、特別な「#!」 PHPスクリプトの最初の行(Shebangと呼ばれます)は効果がありません。ただし、WindowsのGitはShebangの最初の行を認識できます。PHPを使用して、次のようにcommit-msgフックを記述できます。 Windows上で適切に実行されます。

#!D:/php/php.exe

<?php
echo 'commit-msg';
exit( 0 );    

詳しくは windowsのgitフック をご覧ください

0
zhangyu12

その秘密はシバン部分にあると思います-Windowsでは、次のようにsh.exeへのフルパスを指定する必要があります。

#!/bin/sh; C:/path/to/Git/bin/sh.exe

Cygwinがインストールされている場合は、cygwin/binにあるsh.exeまたはbash.exeをポイントすることもできます。ルビー:

#!/usr/bin/env Ruby; C:/path/to/cygwin/bin/Ruby.exe
puts "Ruby HOOK RUNNING"
0
Arleth