Git
不能在 git post-update 掛鉤中呼叫“git reset”?
我已經為我的網頁設置了一個 git 儲存庫(它是簡單的 HTML,由Pandoc從 markdown 生成)。儲存庫只能由我遠端更新,並且我已成功將其配置為使用 HTTPS。
現在,這不是一個裸儲存庫——沒有人會在伺服器上本地更新儲存庫或工作樹,所以我只是在那裡保留一個工作副本,並使其可供 Web 伺服器發布。
一切正常,但是——每次我將更改推送到伺服器時,我都需要自動更新工作樹,所以我編寫了以下
post-update
腳本(在範例中,工作樹位於 中/path/git/me
,儲存庫位於 中/path/git/me/.git
):#!/bin/bash (cd /path/git/me/ && echo "running git reset --hard on `pwd`" && git reset --hard) (cd /path/git/me/ && pandoc -s -o index.html index.md)
當我執行時
git push
,鉤子被執行,但發生了一些非常奇怪的事情:
- git抱怨
'.'
不是儲存庫,並且不執行git reset --hard
命令- 但是,pandoc確實執行沒有問題!
以下是推送的記錄:
$ GIT_TRACE=1 git push 12:21:12:21:27.088581 run-command.c:347 trace: run_command: 'git-remote-https' 'origin' 'https://server.org/git/me' Username for 'https://server.org': me Password for 'https://me@server.org': 12:21:32.624468 run-command.c:347 trace: run_command: 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin' 12:21:32.627833 exec_cmd.c:128 trace: exec: 'git' 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin' 12:21:32.633026 git.c:348 trace: built-in: git 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin' 12:21:32.634024 run-command.c:347 trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress' 12:21:32.634538 exec_cmd.c:128 trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress' 12:21:32.636701 git.c:348 trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress' Counting objects: 2, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 223 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: running git reset --hard on /path/git/me remote: fatal: Not a git repository: '.' To https://server.org/git/me 93be2f2..9cc7a28 master -> master
我在這裡做錯了什麼,如何讓鉤子按預期執行命令?
我發現了問題!
在鉤子執行期間,變數
GIT_DIR
和GIT_WORK_TREE
被設置,git 將忽略目前目錄。似乎我可以將目錄顯式傳遞給 git:git --git-dir /path/git/me/.git --work-tree /path/git/me/ reset --hard
現在一切正常!