git post-receive hook无法跳回原来的cwd

时间:2011-07-11 23:37:17

标签: git git-post-receive

当推送到我们的共享裸存储库(通过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

我找不到任何有关这意味着什么的信息。 (只要我知道,谷歌只会提交对git本身贡献的提交)。所以我阅读并猜测并尝试了......

  • 另外在post-receive hook中设置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 hook

中添加了第二行
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很陌生并且有一种愚蠢的感觉,我错过了一些明显的东西,但没有发现任何关于这个特定错误信息的重要信息让我感到奇怪。推动本身工作正常,顺便说一句。

3 个答案:

答案 0 :(得分:18)

我在同一台服务器上托管的十个网站中也遇到过这个问题。

每个站点都在我们的开发人员推送的Web服务器(未暴露给Web)上有一个裸仓库。和你一样,我们使用git post-receive hook然后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,而dev机器都是1.7.5.4。

所以裸仓库和现场仓库的名称似乎有影响。不确定这是否是git中的错误,或者只是'foo'和'foo.git的某些神奇等效的副作用。

答案 1 :(得分: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

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

答案 2 :(得分:2)

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