【发布时间】:2018-05-04 12:26:12
【问题描述】:
所以我有一个裸存储库,我们用它来控制对我们网页的更改。在那个裸仓库上是一个 post-receive 钩子,当我们将更改推送到它时运行。钩子所做的只是使用以下代码实现对工作目录的更改:
WRK_DIR="/url/to/work/tree/"
GIT_DIR="/url/to/bare/repo.git/"
#Update WRK_DIR with changes pushed into GIT_DIR...
git --work-tree=$WRK_DIR --git-dir=$GIT_DIR checkout -f
无论出于何种原因,我都会收到以下信息:
remote: fatal: Not a git repository: '/url/to/bare/repo.git/'
我已验证该钩子在正确的用户下运行,并且该用户拥有该文件夹的权限。但无论出于何种原因,钩子都找不到目录,我绝对确定 url 是正确的。
跑步
cd /url/to/bare/repo.git/
从钩子内部也返回
remote: hooks/post-receive: line 13: cd: /url/to/bare/repo.git/: No such file or directory
就像我说的,我确定网址是正确的,并且没有错字。任何帮助将不胜感激。
【问题讨论】:
-
路径中有
~(主目录)吗?如果是,则将其更改为真正的 home 路径。 -
@ElpieKay 感谢您的快速回复,但没有路径是 C 盘的完整路径。
-
如果您手动运行此命令,它是否有效?您说“C 驱动器”,这就为错误打开了各种“带有空格和反斜杠的 Windows 路径”的可能性。此外,引用变量总是一个好习惯,例如
git --work-tree="$WRK_DIR" --git-dir="$GIT_DIR" checkout -f以防他们有空格和其他东西。 -
@Mort 感谢您的意见,但我已经设法解决了这个问题。钩子和裸仓库都在服务器上,所以我在钩子中放置了一些 cd 来测试它返回的内容。奇怪的是它返回了我本地机器的内容......不知道为什么,但如果我将变量更改为文件夹的网络位置并转义反斜杠,它执行得很好。
-
我不知道你为什么要尝试这样做。为什么不直接从源中提取作为部署步骤,而不是推送到生产环境?如果你创建一个非裸存储库,那么你就不需要钩子了。
标签: git git-bash githooks git-post-receive git-bare