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本身贡献的提交).所以我读了,猜到并试过......
现在配置看起来像这样
[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的某些神奇等效的副作用.
小智 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)
那和一个很好的胖子检查目录充满代码:)
| 归档时间: |
|
| 查看次数: |
2965 次 |
| 最近记录: |