8

当推送到我们共享的裸存储库(通过 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 本身的贡献中提出提交)。所以我阅读并猜测并尝试了......</p>

  • 另外在接收后挂钩中设置 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 还很陌生,并且有一种愚蠢的感觉,我错过了一些明显的东西,但是没有找到关于这个特定错误消息的任何重要内容让我想知道。推本身工作正常,顺便说一句。

4

3 回答 3

18

对于托管在同一台服务器上的十分之一的站点,我也遇到了这个问题。

每个站点在我们的开发人员推送的 Web 服务器上都有一个裸仓库(不暴露在 Web 上)。和你一样,我们使用 git post-receive 钩子然后GIT_WORK_TREE=/whatever/livesite git checkout -f进入包含实际 Web 服务器根目录的目录。

检查失败的那个有什么不同fatal: Could not jump back into original cwd,我发现在所有工作情况下,存储库名称都是这样的:

/var/www/coolsite.com.git   <-- bare repo
/var/www/coolsite.com.live  <-- checked out from hook; contains site root in public subdir

一个错误是这样的:

/var/www/brokensite.com.git  <-- bare repo
/var/www/brokensite.com      <-- checked out from hook; contains site root in public subdir

因此,让实时签出副本具有这样的名称会导致 git 抛出此错误。将实时站点工作副本存储库的名称更改为以“.wtf”结尾解决了问题(我最终像其他人一样使用了“.live”)。

在我的例子中,Git 的服务器版本是 1.6.1,而开发机器都是 1.7.5.4。

所以bare repo和live repo的名字似乎有影响。不确定这是 git 中的错误还是只是 'foo' 和 'foo.git 的某些神奇等效性的副作用。

于 2011-12-15T01:12:00.993 回答
7

根据我的经验,您的问题在于您的 .git 存储库和工作树目录(您的 post-receive 挂钩正在检出的目录)在同一个目录中:ab/cd。

我也是 GIT 的新手,这篇文章对我帮助很大,非常感谢!在消除了您已经尝试过的所有修复程序之后,我偶然发现了一个帖子(恐怕我现在找不到它)读取 .git 存储库并且工作树目录不能在同一个目录中。

我不知道为什么。

例如,您的/var/www 中有/staging/ 目录。这意味着您应该将裸露的 .git 存储库放在 /var/GIT(或其他东西)中,而不是 /var/www。

我遇到的另一个问题是权限,因此我对两个目录进行了chown'ed 和chmod'ed,以确保我推送的远程用户有权读取/写入这两个目录。

无论如何,我这样做了,我从你所在的地方得到了这个:

Counting objects: 3357, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2848/2848), done.
Writing objects: 100% (3057/3057), 15.20 MiB | 4.70 MiB/s, done.
Total 3057 (delta 1536), reused 0 (delta 0)
Checking out files: 100% (3720/3720), done.
To ssh://xxxxxx@xxxxxxxxxxxxxxx/var/GIT/project.git
   945fe94..dbe1f0b  master -> master

那和一个很好的胖检查目录充满了代码:)

于 2011-08-03T14:25:02.480 回答
2

服务器更新到 git v1.7.5.4 后,问题就消失了。似乎从 v1.5x(服务器)到 1.7x(本地)的差异太大了。

于 2011-08-22T21:01:46.630 回答