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

fab*_*1An 8 git git-post-receive

当推送到我们的共享裸存储库(通过ssh)时,后提交无法正常工作.
这是很常见的,因为我在很多线程发现这里并能正常工作在同一台服务器,它驱动我疯了另外两个仓库.

#!/bin/sh
GIT_WORK_TREE=/ab/cd/staging git checkout -f
Run Code Online (Sandbox Code Playgroud)

存储库本身与钩子要检出的目录位于同一目录中

/ab/cd/barerepo
Run Code Online (Sandbox Code Playgroud)

推送时,它不会将文件签出到预期路径,但会显示以下错误消息:

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
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于这意味着什么的信息.(只要我知道,谷歌只会提交对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
Run Code Online (Sandbox Code Playgroud)

但我也有这个(不费力)

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    sharedrepository = 1
    worktree = /ab/cd/staging
    logallrefupdates = true
[receive]
    denyNonFastforwards = true
Run Code Online (Sandbox Code Playgroud)

我还在post-receive hook中添加了第二行

echo "post-receive done" > updated.txt
Run Code Online (Sandbox Code Playgroud)

它将文件写入裸存储库的目录.这对我来说很有意义,因为GIT_DIR似乎被设置为'.',这是通过我从另一个SO问题得到的post-receive snipped确认的

echo Running $BASH_SOURCE
set | egrep GIT
echo PWD is $PWD
Run Code Online (Sandbox Code Playgroud)

结果:

Running hooks/post-receive
GIT_DIR=.
PWD is /ab/cd/barerepo
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能把git跳回原来的cwd(当前的工作目录?)?仅供参考:我仍然对git很陌生并且有一种愚蠢的感觉,我错过了一些明显的东西,但没有发现任何关于这个特定错误信息的重要信息让我感到奇怪.推动本身工作正常,顺便说一句.

Mas*_*son 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
Run Code Online (Sandbox Code Playgroud)

错误的一个是这样的:

/var/www/brokensite.com.git  <-- bare repo
/var/www/brokensite.com      <-- checked out from hook; contains site root in public subdir
Run Code Online (Sandbox Code Playgroud)

所以让实时签出副本有一个像这样的名称导致git抛出此错误.将实时站点工作副本仓库的名称更改为以".wtf"结尾修复了问题(我最终只使用了'.live'和其他人一样).

在我的例子中,Git的服务器版本是1.6.1,而dev机器是1.7.5.4.

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

  • Werid.如果工作目录是裸仓库的任何子串,它会失败,例如`$ HOME/www`和`$ HOME/www-repo` (3认同)
  • 为我修好了.简介:签出的repo不能与裸仓库具有相同的目录名称(唯一的区别是`.git`dirname后缀).更改其中一个的名称.谢谢! (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

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


fab*_*1An 2

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