git部署项目代码至服务器 · Issue #113 · Qingquan 您所在的位置:网站首页 github部署项目 git部署项目代码至服务器 · Issue #113 · Qingquan

git部署项目代码至服务器 · Issue #113 · Qingquan

2023-03-24 16:24| 来源: 网络整理| 查看: 265

方法一:直接推送部署git push to deploy

参考:

GitHub 博客:Git 2.3 about push-to-deploy Stack Overflow:How to push to a non-bare Git repository? 腾讯云:不需要钩子,使用 git push 部署网站

部署基于 Git 的 Web 项目的一种方法是在服务器上保留一份 checked-out 的工作目录副本。准备好项目新版本后,你将登录服务器并运行 git pull 以获取(或使用钩子 hooks 自动 pull )并部署新更改。虽然这种技术有一些缺点,但它很容易设置和使用,特别是如果你的项目主要由静态内容组成。

使用 Git 2.3 或更新版本后,这种技术变得更加方便。现在,你可以将更改直接 push 到服务器上的仓库。如果未对服务器进行本地修改(保留一个干净的工作目录以避免合并冲突),则将自动检出对服务器当前分支的变化,并即时部署:

$ git init xxx.git $ cd xxx.git && git config receive.denyCurrentBranch updateInstead

注:在服务器上,若不使用 $ git init --bare xxx.git 创建一个裸仓库,而是使用 $ git init xxx.git 创建一个普通仓库,这时,在本地执行 $ git push 推送项目到服务器将失败,除非在 $ git init xxx.git 创建仓库后执行上述命令。

实例: $ git init server $ cd server $ touch a $ git add . $ git commit -m 0 $ git config --local receive.denyCurrentBranch updateInstead $ cd .. $ git clone server local $ cd local $ touch b $ git add . $ git commit -m 1 $ git push origin master:master $ cd ../server $ ls # output:a b 附:第二次 push 推送报错: ! [remote rejected] master -> master (Working directory has unstaged changes) error: failed to push some refs to 'git-name@ip:directory/xxx.git'

解决方法:在 .git/hooks 目录下添加 push-to-checkout 脚本:

git/hooks $ touch push-to-checkout git/hooks $ sudo vim push-to-checkout # 添加脚本 git/hooks $ chmod 775 push-to-checkout # 添加权限

脚本内容:

#!/bin/sh set -ex git read-tree --reset -u HEAD "$1"

然后在本地开发环境中 $ git pull 后再提交。

什么时候不应该使用推送部署push to deploy

通过推送到 Git 仓库进行部署既快捷又方便,但并不适合所有人。例如:

你的服务器将包含一个包含项目完整历史记录的 .git 目录。你要确保它无法展示给用户。 在部署期间,用户可能会暂时遇到处于不一致状态的站点,旧版本的某些文件和新版本的其他文件,甚至是半写文件。如果这对你的项目来说是个问题,那么推送部署可能不适合你。 如果你的项目需要一个“构建”步骤,那么你必须明确地设置它,也许需要通过 githooks 。

方法二:使用git钩子部署deploy by hooks

参考:

git-scm.com:定义 Git 钩子 腾讯云:使用 git 自动部署简单网站 使用 Git 钩子进行博客自动部署 实例:

配置 Git Hook :将目录切换至 /repos/xxx-bare.git/hooks ,用 $ cp post-update.sample post-update 命令复制并重命名文件后 $ sudo vim post-update 修改,增加执行脚本:

#!/bin/sh unset GIT_DIR DIR_ONE=/home/user/www/blog/ # 此目录为服务器页面展示目录 cd $DIR_ONE git init git remote add origin ~/repos/xxx-bare.git git clean -df git pull origin master pm2 restart xxx # pm2重启项目即可

注意: 一定要 unset GIT_DIR 清除变量, 不然会引起 remote: fatal: Not a git repository: ‘.’ 错误。

方法三:使用GitHub进行代码传输

使用「本地开发主机 => 提交代码到GitHub => 服务器Git拉取代码」的形式进行代码传输。

本地开发主机提交代码到 GitHub 后,服务器 $ git clone 克隆代码仓库,或 $ git pull (等价于 $ git fetch + $ git merge )拉取并合并代码。

拉取并合并本地代码实例:

# 查看远程仓库 (py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git remote -v origin [email protected]:FatliTalk/polls.git (fetch) origin [email protected]:FatliTalk/polls.git (push) # 拉取远程仓库 (py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git fetch remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (1/1), done. remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:FatliTalk/polls c756d23..5a5494e master -> origin/master # 对比本地分支和远程分支(这也是使用GitHub管理代码的好处,可以对比修改内容) (py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git diff master origin/master # 合并分支 (py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git merge

注意:

不要在服务器上直接修改代码,不然 $ git pull 会失败。假如真的修改过(例如有一些文件是自动生成的),下次更新代码时,可以删除服务器仓库的代码,重新 $ git clone GitHub 上的代码。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有