1

私の git push 操作は、(多かれ少なかれ) すぐに戻るのではなく、約 25 ~ 30 秒で終了します。ここで見つけた非常に長い受信後 (bash) スクリプトを使用しています: https://raw.github.com/zma/usefulscripts/master/script/post-receive

いくつかの詳細:

  • 私のリモートリポジトリはLANサーバー上にあり、約70MB/秒の読み取り/書き込みアクセスがあります(これは問題ないようです)
  • これは、1 つのテスト ファイルのみを含む新しいリポジトリです。
  • 私はgitextensionによってインストールされたgit bashを使用しています(gitバージョン1.7.11.msysgit.1)
  • gitgui でプッシュ操作もテストしましたが、遅延は同じでした。だから私が使っているフロントエンドとは関係ないと思います。
  • 受信後スクリプトを削除すると、プッシュ操作は問題なく動作します (遅延はまったくありません)。

私はいくつかのテストを行いましたが、受信後スクリプトにすべてコメントアウトされた約 70 行が含まれている場合 (つまり、スクリプトは何もしません)、プッシュに約 5 秒の遅延があります。

これは正常ですか?または、プッシュを高速化する方法はありますか? または、スクリプトのサイズを大幅に縮小する必要がありますか?

更新: 次 のことに言及することが重要です。

  • 私はwindows7を使用しています
  • リモートリポジトリはLinuxサーバーでホストされており、samba経由でアクセスできます
4

4 に答える 4

2

興味深いフォローアップ: 別の PC でスクリプトをテストしましたが、問題なく動作しています。遅延はまったくありません。そのため、git がリモート スクリプトを処理する方法に関して、私の PC にいくつかの問題があります。

リモート リポジトリは samba 共有にあります。2 つのシナリオで Wireshark トレースを取得しました。

  1. cat <path_to_the_script>\post-receivegit bashでコマンドを実行したところ
  2. realgit pushしました

結果 (あまり技術的な詳細なし):

  1. Read AndX Request、FID: 0x228f、オフセット 0 で 1024 バイト (常に 1024 バイト)
  2. 読み取り AndX 要求、FID: 0x21c9、オフセット 0 で 1 バイト (常に 1 バイト)

結論: git push コマンドは、受信後スクリプトを 1 バイトのチャンクで読み取ります

于 2013-06-12T14:14:10.987 に答える
1

smb.conf で次のオプションを使用すると、samba 共有が oplock を使用しないように構成されていることが判明しました。

  • oplock = いいえ
  • level2 oplocks = いいえ

共有の構成からこれらのエントリを削除すると、受信後の実行の遅延が約 4 ~ 5 秒に短縮されました。これは合理的だと思います。

于 2013-06-13T13:55:51.467 に答える
1

git hooks ページpost-receiveには、フックについて明確に言及されています。

このスクリプトはプッシュ プロセスを停止できませんが、完了するまでクライアントは切断されません。そのため、時間がかかる可能性のあることをしようとするときは注意してください。

つまり、あなたの場合、非同期アプローチに切り替える必要があります(Sqeezer答え、賛成、提案されているように、時間がかかるものを修正できない限り):

  • スクリプトが実行すべきことをファイルに書き込むようにする (電子メールを送信する)
  • cron ジョブがそのファイルを取得し、数分ごとに時間のかかるタスクを実行できるようにします。

そうすれば、受信後フックは、クライアント (プッシュが開始された場所からのダウンストリーム リポジトリ) をブロックせずに、できるだけ速く戻ります。

于 2013-06-12T06:44:49.810 に答える
1

脚本解説より

# An example hook script to mail out commit update information.  This hook
# sends emails listing new revisions to the repository introduced by the
# change being reported.  The rule is that (for branch updates) each commit
# will appear on one email and one email only.

次に、スクリプトの下部を見てください。それは言います:

# Note: change the smtp server to yours
        cat $email_tmp_file | mailx -S smtp="smtp://smtp.cse.ust.hk" -s "$emailsubject" -r $senderemail $recipients 

SMTPサーバーを構成していないと思われるため、スクリプトはsmtp.cse.ust.hk接続を待機してから、タイムアウトで切断されます。

于 2013-06-12T06:45:17.510 に答える