リモートで git pull が発生したときにフックする方法はありますか (pre-receive または post-receive に似ています)。基本的に、プルがあるときにリモートが持っているものを何でもコミットできるようにしたいと考えています。
私の状況では、リモートでライブになっているものはすべて、git コミットなしで変更される可能性のある信頼できるソースです。プルするときに、ライブの最新情報を常に取得できるようにしたいと考えています。
まず、実際の質問に答えるために、誰かがフェッチしたときにリモート側で呼び出されるフックはありません。(誰かが引っ張ったとき、リモートが知っているのは、そこからフェッチしたことだけです-実行したかどうかはわかりません、、git pull
... )git fetch
git remote update
実際の状況については、編集後にコミットを行うか、失敗した場合は、変更をチェックし、見つかった場合はコミットする定期的なタスク (cronjob?) を使用するのが最善であるという Magnus に同意します。どちらの選択肢も気に入らない場合は、プルする直前にリモート リポジトリでコミットをすばやく簡単にトリガーできるように、合理化する必要があります。
また、作業ツリーを持つリポジトリを正規のリポジトリと見なさないことをお勧めします。プッシュする必要がある場合は、トラブルを求めています。代わりに、ライブ リポジトリがコミット後にプッシュするベア正規リポジトリを用意し、そのベア リポジトリに post-receive フックをインストールして、必要に応じてライブ リポジトリを更新することができます。
残念ながら、git はこのためのフックをネイティブに提供していません。プル/フェッチを許可する前に何かをチェックしたいという完璧なユースケースだからです。
あなたの「リモート」がローカルマシン上にあるかどうかはわかりませんが、そうでない場合は、まさにこれを目的としたフックを持つ gitolite を見てください。
「gl-pre-git」フック
git には利用できる便利なフックがたくさんありますが、それらはすべてプッシュでのみ実行されます。フェッチまたはクローンで実行されるものは何もなく、git-receive-pack または git-upload-pack (場合によっては) が呼び出される前に何かを実行する方法はありません。
それが gl-pre-git フックの目的です。gl-pre-git と呼ばれる実行可能フックが存在する場合、現在のディレクトリが repo.git に設定され、クライアントが何をしようとしているかに応じて R または W のいずれかになる単一の引数で呼び出されます。
v3 gitolite の場合、トリガーに関するドキュメントは次のとおりです。ドキュメントは少し不可解ですが、その仕組みは次のとおりです。
~/.gitolite.rc に (グローバル スコープで) 追加します。
PRE_GIT =>
[
'<pre_git_trigger_script_name>'
]
同じファイルで、LOCAL_CODE を設定できる行を見て、好きな場所に設定します
LOCAL_CODE に設定したディレクトリに、「triggers」というサブディレクトリを作成<pre_git_trigger_script_name>
し、その時点で実行したいことを指定して呼び出されるスクリプトを作成します... (次のことを必ず実行してください:chmod +x <pre_git_trigger_script_name>
走るgitolite setup
テスト && 良い一日を
更新: 実際に gitolite を使用すると、pre-git トリガーで、存在しないブランチにプッシュしてから、プッシュを拒否するために裸のリポジトリで pre-receive にフックするなどの処理を実行できると思いますがgit add --all . && git commit -m"autocommit" && push gitolite
、その過程で実行します。これは、gitolite ホスティングのユーザー権限がベアでないリポジトリで直接コマンドを実行することを許可したくない場合に便利です。
これまでやったことはありませんが、php 内から bash スクリプトを実行できます。
http://www.devx.com/opensource/Article/40785
http://us2.php.net/function.exec
これにより、PHP スクリプトを介して一連の変更をコミットおよびプッシュできるようになります。その上にインターフェイスをチャックするか、現在の編集プロセスに統合すれば、準備完了です。
フックではこれを行うことはできないと思います。フックのドキュメントを読んで理解していることから、要件に適合するフックはありません。
あなたが望むようなものが必要な場合は、「リモート」で1時間ごとに実行され、ファイルが変更されたかどうかを確認し(git status)、すべてをコミットするスクリプトを作成します(git commit -a -m "Auto commit")。
誰/何がこのファイルを編集していますか? 誰かがサイトで何かを変更したときに何かが変更されている場合、それは何かによってトリガーされる必要があります。つまり、これを自動化できます。このようなことが起こってファイルが保存されたら、そこでコミットをトリガーする必要があります。コミットはいつか行う必要があり、その時点で行うこともできます。
私は git フックを直接使用した経験がありません。このページは役立つかもしれませんが、あなたがそれを実行できるようには見えません。
より簡単な (そしてより良い IMO) ソリューションは、実稼働環境以外のリポジトリを信頼できるソースとして使用することです。あなたはこれができますか?最新と最も安定したものは 2 つの非常に異なるものであるため、実稼働環境が信頼できるソースとして使用されることはほとんどありません...
参考までに、本番環境でのみgit pull または git status を実行します。変更はローカル リポジトリで行われ、テストされ、コミットされ、github にプッシュされてから、運用環境にプルダウンされます。
更新
git の優れた長所と機能の 1 つは、それが分散ソース管理システムであることです。そのため、信頼できる情報源のようなものは実際にはありません。