得到"致命:不是git存储库:'.'"当使用更新后挂钩在另一个repo上执行'git pull'时

Ty *_*y W 84 git githooks

我是git的新手,所以如果我在这里滥用术语,我会道歉(请纠正我),但我会尽我所能.

我正在尝试在Web服务器上设置一个裸git repo(hub)和一个开发站点工作副本(prime).我试过在这篇文章之后模仿它.我希望每当推送集线器repo时都要更新开发工作副本.我的印象是,正确的钩子是这样的post-update,我已经创建了这样:

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET
Run Code Online (Sandbox Code Playgroud)

更新

当我将更改从本地存储库推送到裸集中心时,我从更新后的脚本中获得以下输出:

remote: sites
remote: fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)

但是,如果我以用户"站点"的身份SSH进入服务器并手动执行此脚本,那么这个钩子或脚本可能会出现什么问题?

Ty *_*y W 170

这是最终有效的脚本.我认为我最初失踪的那个阻止它远程工作的是unset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info
Run Code Online (Sandbox Code Playgroud)

  • 我可以确认,取消设置`GIT_DIR`修复了这个问题. (17认同)
  • 对于那些愿意理解原因的人:这是因为git使用变量`GIT_DIR`而不是`PWD`.`cd`-ing改变`PWD`而不是'GIT_DIR`.如果第一个不可用的话,git必须从'GIT_DIR`回退到`PWD`. (15认同)
  • 借调.只有取消设置`GIT_DIR`才有效. (7认同)
  • 这背后的原因是Git将[某些环境变量](https://www.kernel.org/pub/software/scm/git/docs/#_environment_variables)应用于_all_核心git命令。 (2认同)

Ger*_*iro 28

尝试改为:

#!/bin/sh
cd /path/to/working-copy/
env -i git pull
Run Code Online (Sandbox Code Playgroud)