web-dev-qa-db-ja.com

GitプリコミットフックがWindowsで実行されていない

私はGitフックを調べ始めたばかりですが、実行させることはできません。

ローカルリポジトリを設定したため、プロジェクトフォルダーに「.git」ディレクトリが作成されました。 「pre-commit.cmd」という名前のC:/path/to/my/project/.git/hooksディレクトリに「.cmd」ファイルを追加しました。このファイルの内容は次のとおりです。

echo "HOOK RUNNING"
echo. 2>C:/path/to/my/project/.git/hooks/EmptyFile.txt

これにより、テキスト「HOOK RUNNING」がエコーされ、そのディレクトリに空のテキストファイルが作成されます。ただし、IDE(NetBeans)を使用して変更をコミットする場合、またはGit Bashを使用してコミットする場合、ファイルは作成されないため、どちらも事前コミットフックを実行しないようです。

私が理解しているのは、実行するフックを取得するためにあなたがしなければならないことは、フックの名前を持つ実行可能ファイルを追加することです(私がやったように)。私は何か間違っていますか?

注:これはWindows 7 PC上にあります。

36
user1578653

フックの名前をpre-commit(拡張子なし)にするとどうなりますか?

編集:そして、最初の行に#!/bin/shを追加するか、#!/bin/bash(コメントで提案)

48
Asenar

おそらくpre-commitファイルを実行する権限がありません

ターミナルで実行します:

chmod +x .git/hooks/pre-commit

アイデアを与えてくれた@vaughanに感謝

35
edi9999

私にとっては、上記の解決策はどれもうまくいきませんでした。事前コミットファイルをフックから他の場所に移動し、フックからファイルを効果的に削除しました。

それは私のために働いた:D

2
Nilotpal

私の場合、_npm install&誤って削除された。git folder、npm install pre-commit --save働いた

0
Theo

TL; DR

Git for WindowsでのGitフックworkは、デフォルトでgitフックスクリプトが単純であると仮定して

GitとWindowsの背景

注意してくださいGit はシェル用に作成されました 解釈 ;したがって、WindowsコマンドプロンプトまたはWindows製のPowerShellでgitフックを使用すると、本質的に欠陥があり、完全な 相互運用性 は期待できません。

Windowsでgitフックを使用することは可能ですが、多くの欠点があります。

Git for Windows は、bashおよびシェルコマンドを可能にするシェルエミュレーターを使用します。つまり、gitフックがgitによってアクティブ化されると、Windowsバージョンはシェルエミュレーターを使用してコマンドを実行します。次に、これらのシェルコマンドをWindowsオペレーティングシステムが理解できるコマンドに変換します。意味のある単純なシェルスクリプトは、すぐに動作します。たとえば、gitリポジトリの初期化に付属するgitフックpre-commitは、変更なしで実行できます。

デフォルトの動作の例

  1. コマンドgit initを使用してgitリポジトリを初期化します
  2. cd .git\hooksコマンドでgit hooksディレクトリに移動します
  3. このディレクトリには、すべてのgitフックスクリプトが保持されます。 pre-commitという名前のファイルを作成します

    ファイルの名前は重要です

  4. 内容を次のシェルスクリプトに置き換えます

    #!/bin/sh
    
    echo "Hello, World!"
    
    
  5. プロジェクトのルートディレクトリに戻り、test.txtコマンドを使用してecho "something" > text.txtという名前のファイルを作成します
  6. コマンドgit add test.txtを使用して、コミットするファイルをステージングします
  7. 変更をコミットし、コマンドgit commit -m "test commit"を使用してプリコミットフックがアクティブになるのを確認します
  8. 出力が次のようになることを確認します
    git commit -m "test commit"
    Hello, World!
    [master f00ccea] test commit
    

悪い行動の例

非常に高度なシェルスクリプトを使用してgitフックで処理を行う場合、Windowsシェルの解釈が常に重なるとは限りません。たとえば、NPM用のハスキーgitフックプラグインをきれいなフォーマッターと一緒に使用する場合、コマンドは1-1をマップしません。コミット前のgitフックがWindowsで失敗することを意味します。

回答者1578653質問

Gitフックは実行可能なスクリプトです。ただし、シェルスクリプト(.cmd)ではなく、コマンドプロンプトスクリプト(.sh)を使用しています。 Windowsオペレーティングシステムで説明したこの動作が必要な場合は、pre-commitという名前のファイルを作成し、.git\hooksディレクトリに配置します(作業中のプロジェクトに対して)。次に、そのファイルに次のコンテンツを配置します。

。git\hooks\pre-commit

#!/bin/sh

echo "HOOK RUNNING"
thisCausesError 2> .git/hooks/EmptyFile.txt

Gitフックが機能し、HOOK RUNNINGという単語をコンソールに出力し、thisCauseErrorがエラーメッセージをstderrに出力し、ファイルEmptyFile.txt

0
Dalton

多分それは誰かを助けるでしょう-私の場合、私はcore.hooksPathを間違ったディレクトリに設定していました。 git config --global core.hooksPath '~/.githooks'でリセットすると問題が解決しました:)

0
mtraton