Git

不能在 git post-update 掛鉤中呼叫“git reset”?

  • August 25, 2015

我已經為我的網頁設置了一個 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_DIRGIT_WORK_TREE被設置,git 將忽略目前目錄。似乎我可以將目錄顯式傳遞給 git:

git --git-dir /path/git/me/.git --work-tree /path/git/me/ reset --hard

現在一切正常!

引用自:https://serverfault.com/questions/716349