【发布时间】:2011-10-03 05:34:56
【问题描述】:
当推送到我们共享的裸存储库(通过 ssh)时,提交后无法正常工作。
这是很常见的,因为我在这里的许多线程中都发现了它,它适用于同一服务器上的其他两个存储库,这让我发疯了。
#!/bin/sh
GIT_WORK_TREE=/ab/cd/staging git checkout -f
存储库本身与钩子要签出到的目录位于同一目录中
/ab/cd/barerepo
推送时,它不会将文件检出到预期的路径,但会给出以下错误消息:
Writing objects: 100% (3/3), 299 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
fatal: Could not jump back into original cwd
error: hooks/post-receive exited with error code 128
我找不到任何关于这意味着什么的信息。 (据我所知,Google 只会从对 git 本身的贡献中提出提交)。所以我阅读并猜测并尝试了......
- 在接收后挂钩中额外设置 GIT_DIR
- 使用 --git-dir=/ab/cd/barerepo --working-dir=/ab/cd/staging 重新初始化裸仓库
- 在 barerepo/config 中手动设置工作目录
- 将裸仓库设置为空白并提交
- 通过克隆设置裸仓库
现在的配置是这样的
[core]
repositoryformatversion = 0
filemode = true
bare = true
但我也有这个(不费吹灰之力)
[core]
repositoryformatversion = 0
filemode = true
bare = true
sharedrepository = 1
worktree = /ab/cd/staging
logallrefupdates = true
[receive]
denyNonFastforwards = true
我还在 post-receive 钩子中添加了第二行
echo "post-receive done" > updated.txt
它将文件写入裸存储库的目录。这对我来说很有意义,因为 GIT_DIR 似乎设置为“。”,这得到了我从另一个 SO 问题中得到的后接收片段的证实
echo Running $BASH_SOURCE
set | egrep GIT
echo PWD is $PWD
结果:
Running hooks/post-receive
GIT_DIR=.
PWD is /ab/cd/barerepo
那么我怎样才能让 git 跳回原来的 cwd(当前工作目录?)? 仅供参考:我对 git 仍然很陌生,并且有一种愚蠢的感觉,我错过了一些明显的东西,但是没有找到关于这个特定错误消息的任何重要信息让我感到奇怪。推送本身工作正常,顺便说一句。
【问题讨论】:
-
此存储库的暂存目录的权限是否正确?也就是说,它们是否与有效的存储库相同?
-
是的,暂存目录都有
drwxrwxr-x,相同的用户和相同的组(gitusers)。推送到 repo 的用户也是该组的成员。存储库中的子目录具有drwxrwsr-x,因此当用户推送他们的提交时,该组保持 gitusers。
标签: git git-post-receive