无法在 git post-update 钩子中调用“git reset”?

无法在 git post-update 钩子中调用“git reset”?

我已经为我的网页设置了一个 git 存储库(它是简单的 HTML,由 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://[email protected]': 
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

我在这里做错了什么,以及如何让钩子按预期运行命令?

答案1

我找到问题了!

在执行钩子期间,变量GIT_DIRGIT_WORK_TREE被设置,git 将忽略当前目录。而且我似乎可以将目录明确传递给 git:

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

现在一切正常!

相关内容