[英]How to setup server side pre-receive hook?
我是 git hooks 和服務器端 git 功能的新手。 我在客戶端 git 上工作以提交和推送我的代碼,我們使用應用程序生命周期管理(ALM)工具進行 git merge。 我正在嘗試編寫 git hooks 來對存儲庫中的新文件/修改文件進行一些測試。 我能夠編寫和測試客戶端鈎子,比如pre-commit
現在,我需要在合並到 master 之前添加一些服務器端 git hook 來驗證文件,因為有一個更改可以使用-no-verify
選項跳過客戶端驗證。 當我瀏覽一些 git hook 教程時, pre-push
hook 是服務器端掛鈎。 我嘗試創建 pre-push hook,它正在客戶端工作。 現在,即使使用--no-verify
選項(不應在客戶端控制),如何使其作為服務器端掛鈎並在用戶嘗試推送更改時強制驗證文件。
我的大問題是當我們從本地分支/倉庫執行git push
時如何觸發服務器鈎子。
鈎子的創建:
創建了一個名為 pre-commit 的鈎子,並將它放在某個文件夾下git_hooks/pre-push
和.git/hooks/pre-push
。 現在,為我的預推送腳本創建了一個符號鏈接。 因此,每當我執行git push
它都會觸發 .git/hooks/pre-push 這是我的腳本git_hooks/pre-push
的符號鏈接
編輯:
我認為pre-push
和pre-receive
鈎子是一樣的,因為兩者都是在git push
命令上觸發的,但是pre-push
只在客戶端工作, pre-recieve
在服務器端工作。 我創建了pre-receive
hook 並將其推送到 master 分支。 現在,當我執行git push
此錯誤: cannot spawn hooks/pre-receive: No such file or directory 。
我正在Windows和Linux平台上嘗試這個。 在 Windows 上我收到這個錯誤,在 Linux 上它甚至沒有被觸發。 我在兩個平台的 master 分支上都放置了pre-receive
hook。
您應該查看服務器端掛鈎文檔部分。
有三個鈎子可以讓你對 git push 過程的不同階段做出反應。
當您推送到服務器時pre-receive
觸發pre-receive
鈎子。 然后對於您推送的每個分支,都會觸發update
掛鈎。 當這些鈎子沒有錯誤地完成時,你的補丁就會被應用並觸發post-receive
鈎子
關於pre-receive
hook 的更詳細的DOC :
當 git-receive-pack 對其存儲庫中的 git push 和更新引用做出反應時,該鈎子會被調用。 就在開始更新遠程存儲庫上的 refs 之前,會調用 pre-receive 鈎子。 它的退出狀態決定了更新的成功或失敗。
UPD
要設置pre-receive
服務器端掛鈎,您應該將腳本放入服務器上的.git/hooks
目錄中。 並將其命名為pre-receive
。 就這些。
你不應該在你的倉庫中創建hooks
目錄並提交它。 pre-receive
腳本在 repo 之外
UPD
這是示例腳本:
#!/bin/bash
# check each branch being pushed
echo "pre-receive HOOK"
while read old_sha new_sha refname
do
if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
exit 1
fi
if git diff "$old_sha" "$new_sha" | grep -qE '^\+.*\s+$'; then
echo "Saw whitespaces at EOL."
git diff "$old_sha" "$new_sha" | grep -nE '^\+.*\s+$'
exit 1
fi
done
exit 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.