我有以下问题.我已将'post-receive'更新为cd到某个目录,然后将repo拉进去进行部署,如下所示:
#!/bin/bash
cd /var/www/site
git pull origin master
Run Code Online (Sandbox Code Playgroud)
但是每当我在本地机器上执行'git push origin master'时,我会得到以下结果:
Counting objects: 5, done.
Delta compression using up to 2 threads.
(etc..)
remote: fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)
然而,当我手动cd到/var/www/site并做git pull origin master它出色的工作.
我正在试图弄清楚如何为github服务挂钩保护webhook接收器.
在github手册页中,当您查看github钩子将来自哪个IP地址的部分时,它会出现以下警告:
"我们强烈建议您不要使用Service Hooks的白名单IP.而是设置HTTPS和基本身份验证来验证传入请求."
在关于post post hooks的文档中,我没有看到任何设置基本身份验证的方法.
如何通过github post-recieve/service/web hook使用基本身份验证,通知我提交到存储库?
我到处都看到了这个错误,但我发现的解决方案都没有帮助解决这个问题.我正在Mac上本地开发一个rails应用程序,并在DigitalOcean上设置了一个Droplet来推送应用程序.我的Droplet正在运行Ubuntu 14,我正在使用Git post-receive hook进行部署.这是钩子:
#!/bin/bash
GIT_DIR=/home/xxx/yyy_production
WORK_TREE=/home/xxx/yyy
export XXX_DATABASE_USER='xxx'
export XXX_DATABASE_PASSWORD='12345'
export RAILS_ENV=production
. ~/.bashrc
while read oldrev newrev ref
do
if [[ $ref =~ .*/master$ ]];
then
echo "Master ref received. Deploying master branch to production..."
mkdir -p $WORK_TREE
git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f
mkdir -p $WORK_TREE/shared/pids $WORK_TREE/shared/sockets $WORK_TREE/shared/log
# start deploy tasks
cd $WORK_TREE
bundle install
rake db:create
rake db:migrate
rake assets:precompile
sudo restart puma-manager
sudo service nginx restart
# end deploy tasks
echo "Git hooks deploy complete" …Run Code Online (Sandbox Code Playgroud) rvm git-post-receive gem-bundler ruby-on-rails-4 ubuntu-14.04
我的设置是一个Windows XAMPP服务器,启用了cURL,并安装了Git和Hudson.Hudson每分钟都会调查Git来查找更改,如果找到它们,它会创建一个构建版本.我使用这个版本作为我的测试服务器.这很好用.
我想在我的中央远程存储库上设置一个post-receive hook,它运行Hudson的force build功能.
我在我的中央Git存储库的hooks目录中创建了一个名为"post-receive"的post-receive文件,该文件是从开发人员的本地分支推送到的.他们每个都推送到中央存储库中的自己的分支.我想在每次推送后立即运行post-receive构建,而不是每分钟都有Hudson轮询Git.
当我打开一个shell到远程服务器并在hooks文件夹中运行"post-receive"时,它会运行.当人们从本地存储库副本推送到中央存储库副本时,它就不会被调用.
也许我不是在解释这个问题,但这就是我对Git的理解.
收到后代码是两行:
#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken
Run Code Online (Sandbox Code Playgroud)
再一次,当我打开一个shell并运行它时,它可以工作,但是当有人推动它时,没有任何反应,直到一分钟或更短的时间过去,Hudson意识到Git已经改变,然后它就会构建.
我很乐意澄清是否需要.任何帮助是极大的赞赏.
编辑:玩了之后,我觉得也许后续接收没有执行,因为参考没有被更新的东西?git文档说
在更新所有引用后,它将在远程存储库上执行一次.
这是否意味着如果没有更新,它将不会执行?如果是这样,我很确定事情正在更新,所以它不应该适用.
这是我的过程:在本地进行编辑.提交编辑.从我的HEAD推送到名为'mybranch'的远程分支(不是主分支,已检出)这是我希望我的钩子执行的点.
当推送到我们的共享裸存储库(通过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 …Run Code Online (Sandbox Code Playgroud) 我在与生产网络服务器相同的服务器上运行GitLab v5.2(/ var/www中的Document Root).
我正在尝试设置一个标准的GitLab Post-Receive Hook,但我发现很少有关于如何设置脚本来处理发布的JSON数据的信息.我不打算做任何自定义的事情,只是开箱即用,我想在我的网站位置接收后接收数据(请记住在同一台服务器上),然后在收到时从origin-master拉出(提供后接收数据源于推送到主分支).这样,在/ var/www中找到的网站总是与主人相同.
有人可以,从帖子数据中给我一个拉动脚本的例子,或者指向我正确的方向让我创建一个?
GitLab Hook请求示例 - 对于那些没有GitLab实例的人,这里是GitLab Post-Receive JSON数据的样子(直接来自GitLab帮助)
{
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"ref": "refs/heads/master",
"user_id": 4,
"user_name": "John Smith",
"repository": {
"name": "Diaspora",
"url": "git@localhost:diaspora.git",
"description": "",
"homepage": "http://localhost/diaspora",
},
"commits": [
{
"id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"message": "Update Catalan translation to e38cb41.",
"timestamp": "2011-12-12T14:27:31+02:00",
"url": "http://localhost/diaspora/commits/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"author": {
"name": "Jordi Mallach",
"email": "jordi@softcatala.org",
}
},
// ...
{
"id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "fixed readme",
"timestamp": "2012-01-03T23:36:29+02:00",
"url": "http://localhost/diaspora/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"author": {
"name": "GitLab dev user", …Run Code Online (Sandbox Code Playgroud) 我有一个带有子模块的 git repo。
我会在接收后挂钩文件中使用:
git --git-dir="$GIT_DIR" --work-tree="$GIT_WORKDIR1" submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
remote: fatal: /usr/libexec/git-core/git-submodule cannot be used without a working tree.
Run Code Online (Sandbox Code Playgroud)
我没有得到这个问题的解决方案。
我该怎么做才能让它发挥作用?
在bash脚本中,我做了一个
git push
Run Code Online (Sandbox Code Playgroud)
我检查它的退出状态.
在远程服务器上有一个post-receive hook,可以做一些事情.如果发生错误,则post-receive挂钩将以非零值退出.
但是当post-receive hook错误输出时,git push会正常退出.除非我专门检查输出的特定错误字符串(我不是),我的脚本认为一切正常.
我有一个简单的方法来确定接收后挂钩是否失败?
我们的Git工作流的基本设置是本地网络服务器上的裸存储库,有两个开发人员推送/拉动它.
我们希望自动复制(签出)被推送到本地网络服务器上不同位置的每个分支.举例说明:
将'develop'分支复制到'develop'子文件夹.将"主"分支复制到"主"子文件夹.
我们遇到的问题是获得post-receive hook来做到这一点.这是我们目前拥有的:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then
GIT_WORK_TREE=/master
git checkout -f $branch
echo 'Changes pushed master.'
fi
if [ "develop" == "$branch" ]; then
GIT_WORK_TREE=/develop
git checkout -f $branch
echo 'Changes pushed to develop.'
fi
done
Run Code Online (Sandbox Code Playgroud)
收到的错误是:
'remote:fatal:这个操作必须在远程工作树中运行:推动变革发展.
正如您对该错误所期望的那样 - 实际上没有任何内容被检出.
我也尝试过这种方式接收,但同样的问题:
#!/bin/bash
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ]; then …Run Code Online (Sandbox Code Playgroud) 我需要在服务器端挂钩中获取已更改文件的列表。例子:
Local commit 1:
M test.txt
M test2.txt
Local commit 2:
M test.txt
A test3.txt
Run Code Online (Sandbox Code Playgroud)
两个提交都被推送到服务器(裸仓库)。我需要遍历文件列表并通过 curl 在其他地方发布每个文件:
M test.txt
M test2.txt
A test3.txt
Run Code Online (Sandbox Code Playgroud)
我正在努力寻找实现这一目标的文档。我知道这些修订是针对标准输入的。我如何实际遍历推送的文件,并引用它们进行 curl 上传(这似乎很困难,因为它是一个裸仓库)?
#!/bin/bash
while read oldrev newrev refname; do
echo $oldrev
echo $newrev
echo $refname
done < "${1:-/dev/stdin}"
Run Code Online (Sandbox Code Playgroud) git-post-receive ×10
git ×8
webhooks ×2
bash ×1
curl ×1
gem-bundler ×1
git-bash ×1
githooks ×1
github ×1
gitlab ×1
hudson ×1
json ×1
rvm ×1
ubuntu-14.04 ×1