3

コードをプッシュするたびに実行されるサーバー側フック(更新後)があります。プッシュする新しい変更がない場合でも、それを実行する方法(または別のフック?)はありますか?

例:

$ git push origin master
remote: Hook running....
$
$ git push origin master
Everything up-to-date
$

もう一度実行してほしい。それは可能ですか?

4

2 に答える 2

1

pre-receiveフックを作成し、それを作成exit 1し、クライアントからgit push origin master HEAD:non-existing-branch. pre-receiveに変更がなくても、これによりフックがトリガーされmasterます。

エラー メッセージを回避するには、pre-receiveフックを正常に終了させ ( exit 0)、手動でフックnon-existing-branchからを削除しpost-receiveます。ただし、これにより、別のクライアントから開始されたフックが実行されない小さな時間枠 (ファイルnon-existing-branchが存在する場合) が作成されます。git push ...

于 2013-04-13T09:55:31.860 に答える
0

答えてくれた@ptsに感謝します(今日はすべての投票を使用しました。すぐに投票することはできません:))。(私のような)それがどのように機能するかを正確に理解するのに少し問題がある人のために、これは単純なコマンドラインログであり、non-existing-branchto triggerの使用を示していますpre-receive

# create original repo:

$ cd /tmp
$ mkdir repotest_git
$ cd repotest_git/
$ git init
Initialized empty Git repository in /tmp/repotest_git/.git/
$ git config user.name "Your Name"
$ git config user.email you@example.com

# populate repo with 1 commit:

$ echo "test" > test.txt
$ git add test.txt
$ git commit -m "initial commit"
[master (root-commit) 2b60608] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ 

# create remote "bare" repo; and add pre-receive hook there:

$ cd /tmp
$ git clone --bare repotest_git repotest-remote.git
Cloning into bare repository 'repotest-remote.git'...
done.
$ cd repotest-remote.git
$ 
$ cat > hooks/pre-receive <<"EOF"
#!/bin/sh
echo from pre-receive: HELLO_VAR [$HELLO_VAR]
exit 1
EOF
$ chmod +x hooks/pre-receive

# go back to original repo, add a remote reference
# to the newly created remote "bare" repo; update with pull:

$ cd /tmp
$ cd repotest_git
$ git remote add origin file:///tmp/repotest-remote.git
$ git pull origin master
From file:///tmp/repotest-remote
 * branch            master     -> FETCH_HEAD
Already up-to-date.

# try testing the hook script;
# since we don't have any changes, Everything is 
# up-to-date, and the pre-receive won't trigger:

$ git push
Everything up-to-date

# try testing with HEAD:non-existing-branch
# pre-receive gets triggered - and 
# we can see variable is not there:

$ git push origin master HEAD:non-existing-branch
Total 0 (delta 0), reused 0 (delta 0)
remote: from pre-receive: HELLO_VAR []
To file:///tmp/repotest-remote.git
 ! [remote rejected] HEAD -> non-existing-branch (pre-receive hook declined)
error: failed to push some refs to 'file:///tmp/repotest-remote.git'

# try testing again, this time specify 
# env. variable on command line....
# pre-receive gets triggered - and 
# we can see variable is there:

$ HELLO_VAR=hello git push origin master HEAD:non-existing-branch
Total 0 (delta 0), reused 0 (delta 0)
remote: from pre-receive: HELLO_VAR [hello]
To file:///tmp/repotest-remote.git
 ! [remote rejected] HEAD -> non-existing-branch (pre-receive hook declined)
error: failed to push some refs to 'file:///tmp/repotest-remote.git'

ここで、ローカル作業の場合、すべてが変数で期待どおりに機能します。ただし、明らかに、リモートリポジトリがサーバーなどの背後にある場合、変数がどのように/どこで終了したかを確認するのに問題が発生する可能性があります-そのため、毎回ファイルを変更することなく、その側面のみをデバッグすると非常に便利です + git add/ commit/ push、スクリプトをトリガーするだけです。

于 2013-04-22T20:49:58.813 に答える