2

Windowsでgitpost-receiveフックを動作させようとしています。

私はGit1.7.9(Msysgit)を使用しており、ローカルにリポジトリがあり、リモートサーバーにベアリポジトリがあります。フェッチ、コミット、プッシュなどができます。ファイルを作業フォルダー(展開プロセスの一部)にチェックアウトする受信後フックを設定しましたが、機能していないようです。

これが私がすることです:

  1. ファイルを変更し、ステージングしてコミットします
  2. リモートサーバーにプッシュ-正常に
  3. エコーが表示されることを期待します-エコーが表示されない
  4. サーバー上の作業フォルダを確認してください-最新のファイルがありません
  5. サーバーにログオンし、フックスクリプトを手動で実行します。最新のファイルが作業フォルダーにチェックアウトされます。

メッセージをエコーする以外に何もしないようにフックを変更しました。プッシュした後、コンソールにこれが表示されるはずだと読みました。しかし、これは表示されていないので、フックが発射されていないと推測できます。

リクエストを処理し、ローカルでGUIを介して一時停止しているサーバーで、gitdotaspxを使用してHTTPをプッシュしています。それが失敗した後、私はBonoboを試しましたが、GUIまたはbashコンソールを介してプッシュするとフックが機能しません。

私は誰かがこれをどこかで働いていると思いますが、2日間検索した後、私が見つけたのは役に立たない解決策か、同じ問題を抱えている人々が答えられなかったということです。

(私はgit初心者です)。

乾杯。

アップデート

私はそれがパーミッションに関係しているのではないかと考え始めていますが、NTFSではなくUnixパーミッションです。@eisがアクセス許可について言及したとき、私はNTFSを想定していました。しかし、さらに掘り下げた後でも、Windows上のGitはUnixファイルの権限をチェックしているようです。

ls -oしたがって、問題は、受信後のファイルが-rw-r--r--(644と思います)のように実行可能ではないことだと思います。これをbashで変更してからchmod 777 post-receive実行するとls -o、権限は同じになります。

奇妙なことに、(notepad ++を使用して)post-receiveを編集するとすぐに、実行ビットが削除されます。(.batで終わる私のテストスクリプトは実行ビットを保持しますが...)

ところで、私がログオンしているユーザーは(によるとls -o)ファイルの所有者ですが、アクセス許可を設定できません。

今、本当に混乱し始めています。私は本当に明白な何かを逃していますか?

アップデート2

どちらchmod 777 post-receiveも機能しませんchmod a+x post-receive。新しいクリーンな受信後ファイルを取得し、サーバーにアップロードしてアクセス許可を確認すると、実行されました。Windowsで(サンプルを削除するために)ファイルの名前を変更すると、executeが削除されます。私がbashでそれを実行すると、 mvexecuteが保持されます。しかし、ファイルを編集するたびに(Windowsまたはviを使用したbashで)、executeは削除されます。

では、問題は、ファイルを編集するときに実行ビットが削除されるのはなぜですか?

うまくいけば、これが最後のハードルであり、実行されない原因です...

4

2 に答える 2

1

これを機能させるには、git にパッチを適用する必要があります。builtin/receive-pack.c のチェックはaccess(path, X_OK). msysgit では、これは X_OK ビットを破棄する mingw_access に転送されます。Windows では単純にサポートされていないためです。

Windows では、ファイルが実行可能であることを指定するフラグがありません。多くの場合、システムはこれをエミュレートします。たとえば、tcl は PATHEXT 環境変数の拡張子を探して、ファイルが実行可能かどうかを判断します。フック名は拡張子なしでハードコーディングされているため、ここではできません。

代わりに、アクセス テストを変更して、ファイルの存在を確認してexecvからパスを呼び出すようにすることをお勧めします。これの mingw バージョン (compat/mingw.c 内) は、スクリプト ファイルを探し、shbang 行を読み取り、適切なインタープリター (sh、perl など) を起動します。したがって、変更するbuiltin/receive-pack.c:run_update_hookと、これが機能するようになります。現在、実行中のフックが使用してstart_commandおり、execv を呼び出す必要があると思います。

要するに、アクセス テストを変更すると、おそらく動作するようになります。

于 2012-02-24T12:38:13.773 に答える