74

How do I force git to run a post-receive hook on a server even if I don't have a new commit to push?

Background

I use git to automatically deploy a website to a server. I have a bare repo in a protected area of the server and a post-receive hook that checks out the contents and systematically copies over certain files into a public_html folder. (Inspired by this tutorial)

I got tired of modifying the post-receive hook manually on the server, so my post-receive hook now actually copies over a new version of itself from the repo:

#!/bin/sh

rm -rf ~/../protected/*
GIT_WORK_TREE=~/../protected git checkout -f

# Rewrite over this file with any updates from the post-receive file
cp ~/../protected/post-receive hooks/post-receive

# Delete public_html
# Copy stuff public_html

The problem, of course, is that the new post-receive hook never gets run. A seemingly simple solution would be merely to push again, but now everything is already up to date. This is annoying, because it requires me to fake a new commit every time I update the post-receive hook. Is there a way to invoke the post-receive hook without faking a commit or sshing in?

What I tried

git push
git push -f
4

9 に答える 9

25

これがおそらく「危険」と見なされることはわかっていますが、私は端に生きるのが好きです.

リモートブランチを削除してから、もう一度プッシュします。物を失う可能性を制限するために、まずローカル ブランチが最新であることを確認してください。

したがって、ポストレシーブをトリガーしたい場合、私の場合はテストブランチをプロビジョニングするために、私がすることは次のとおりです。

$ git push origin :testing
$ git push origin testing

ただし、これを答えとして受け入れないでください。それは単なるFYIのことです。

于 2014-08-07T00:25:55.327 に答える
3

空のコミットを試し、アップロード ブランチを削除しました。

しかし、直接の ssh コマンドはどうでしょうか。

ssh your_host /path/to/your_repo/hooks/post-receive
于 2016-09-08T00:10:50.577 に答える
2

これを行うためにbash関数を作成しました。それに応じて設定できるsshアクセスがあることを前提としています~/.ssh/config。デフォルトのリモートは origin です

kick-git() {
    remote="${1:-origin}"
    ssh $(echo $(git remote get-url "$remote")/hooks/post-receive | tr ':' ' ')
}

ソースと実行kick-git [remote]

于 2018-01-09T18:33:48.663 に答える
1

Jamie Carl の提案は気に入っていますが、機能せず、次のエラーが発生しました。

remote: error: デフォルトでは、現在のブランチの削除は拒否されます。これは、次のエラー: 'git clone' でファイルがチェックアウトされず、混乱を招くためです。

私の場合、自分のローカルホストで受信後フックを裸のリポジトリに対してテストしています。警告/非常に重要です。このコマンドはサーバーの場所でのみ実行してください!remote

git update-ref -d refs/heads/develop 

これにより、develop ブランチの参照が削除されます (そのブランチにデプロイしたファイルも削除する必要がある場合があります)。次に、そのブランチにgit push deploy_localtest develop必要なプッシュ コマンドを実行できます。

于 2015-12-17T04:46:40.110 に答える