Git常用操作:基础命令、生成公钥、webhook同步

该文详细介绍了在Windows环境下Git的下载安装过程,以及Git的基本命令,包括克隆、初始化、与仓库建立连接、下拉和提交代码。同时,文章还讲解了如何生成和使用本地Git公钥,以实现免密提交。最后,文中阐述了Webhook的设置方法,实现本地、码云和服务器代码的自动同步。

下载安装GIT

此处只介绍windows系统下的安装,linux一般都是自带git(自行百度)

下载Git 官方地址为:https://git-scm.com/download/wi
在这里插入图片描述
下载好对应的安装程序打开一路点击下一步即可,最终鼠标右侧菜单栏出现对应部分即为安装成功
在这里插入图片描述

基础命令

记录下常用的git基础命令

克隆

git clone 仓库地址

其中仓库地址大概有两种

  • 其一类似于:https://gitee.com/******
  • 其二类似于:git@gitee.com:******,这种码云注册公钥后每次提交下拉就不用验证身份了

初始化

git init

与仓库建立连接

git remote add origin git@gitee.com******

下拉代码

通常命令

git pull

初始化仓库后的首次下拉,需要指定分支

git pull origin master

强制下拉

git fetch --all && git reset --hard origin/master && git pull

提交代码

检查当前代码差异

git status

提交所有修改

git add .

提交本次修改备注(描述一下这次提交改了什么东西,方便版本追溯)

git commit -m 'hello world'

通常提交命令

git push

初始化仓库后的首次提交

git push -u origin master

清空本地缓存

通常用于新增.gitignore文件中的排除文件

git rm -r --cached .

本地生成GIT公钥

将git公钥添加到码云可以让每次代码同步时无需校验身份;

生成本地公钥

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

注意:这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用的邮箱。
查看公钥

cat ~/.ssh/id_rsa.pub

可能会用到全局注册

git config --global user.email  "you@example.com" //邮箱为你的注册码云账号时绑定的邮箱
git config --global user.name  "Your Name"        //用户名为你码云注册时的登录名

公钥示例

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6SAt7JIuZRXECYH+WKvDjPb6Zf22L2p6U******

webhook(本地-码云-服务器代码同步)

简单讲就是再提交代码到远程仓库时,项目生成环境自动同步最新的代码版本(我认为的热传递),下面以linux系统为例展示下本地--码云--项目服务器代码同步
1.进入码云网站注册/登录账户,码云传送门
在这里插入图片描述
注册时有个邮箱,不是邮箱注册的到设置里面设置一下,最终要拿到邮箱(设置-邮箱管理)和登录名(码云个人主页@后面的内容),相关码云位置随着码云更新可能会变

2.新建码云的项目仓库,此处可以拿到一个仓库地址例如:git@gitee.com:******
在这里插入图片描述
3.本地电脑安装git,根据上面生成公钥的方法拿到本地公钥(此处不展示),添加到码云,使用基础命令测试本地与码云的代码同步
在这里插入图片描述
4.本地无误后,进入linux服务器切换www用户(注意:用www用户生成公钥添加到码云,原理与本地生成方式相同)

su www

可能会出现无法切换的情况,如下图:
在这里插入图片描述
这是因为用户的shell,禁止了www用户登录,修改/etc/passwd文件,将“/sbin /nologin”改成“/bin/bash”。(如下图):
在这里插入图片描述
2.创建项目根目录

mkdir new-working-system

目录名根据自己的项目自行更改,创建好后如下:
在这里插入图片描述

3.进入项目目录中,初始化仓库(注意要用www用户),生成服务器公钥添加到码云(不介绍)

cd new-working-system/

4.初始化仓库与远程仓库建立链接

git init
git remote add origin git@gitee.com:******
git pull origin master

如何git提示没有指定分支

git branch --set-upstream-to=origin/master master

5.测试一下服务器与码云的git同步效果,无误后在项目根目录提交webhook文件(此处php展示)

$cmd="git fetch --all && git reset --hard origin/master && git pull";
$r= shell_exec($cmd);
print_r($r);

6.将webhook文件的服务器访问地址添加至码云仓库中,添加后,修改文件进行测试,查看是否成功实现三端同步即可。
在这里插入图片描述

<think>我们正在搭建一个自动化部署环境,涉及以下组件:-Git仓库(在Ubuntu上)-Webhook(用于触发部署)-中转服务器(10.0.0.23)-两台Web服务器(10.0.0.21和10.0.0.22)流程:1.开发者推送到Git仓库。2.Git仓库通过Webhook通知中转服务器(10.0.0.23)。3.中转服务器使用rsync将代码同步到两台Web服务器(10.0.0.21和10.0.0.22)。我们将分步骤完成:步骤1:在Ubuntu上搭建Git仓库步骤2:配置Webhook(在Git仓库服务器上)以通知中转服务器步骤3:在中转服务器上设置Webhook接收服务(使用一个简单的HTTP服务器来接收Webhook请求,然后触发同步脚本)步骤4:编写同步脚本(在中转服务器上使用rsync同步到两台Web服务器)步骤5:设置SSH免密登录(从中转服务器到两台Web服务器)以便rsync无需密码详细步骤:###步骤1:在Ubuntu上搭建Git仓库1.安装Git:```bashsudoaptupdatesudoaptinstallgit```2.创建一个Git用户来运行仓库:```bashsudoaddusergit#设置密码等```3.切换到git用户,创建仓库目录:```bashsu-gitmkdirmyrepo.gitcdmyrepo.gitgitinit--bare```4.设置仓库的权限(可选,确保仓库安全):```bash#比如,设置git用户的shell为git-shell(限制登录)sudochshgit-s/usr/bin/git-shell```5.开发者可以在本地克隆这个仓库:```bashgitclonegit@your-server-ip:/home/git/myrepo.git```###步骤2:在Git仓库服务器上配置Webhook我们需要在Git仓库服务器上设置一个Webhook,当有推送时,向中转服务器发送POST请求。这里我们使用Git自带的`post-receive`钩子。1.进入仓库的钩子目录:```bashcd/home/git/myrepo.git/hooks```2.创建`post-receive`钩子文件:```bashnanopost-receive```3.在`post-receive`文件中写入以下内容(用curl触发中转服务器的webhook接收端点):```bash#!/bin/bashwhilereadoldrevnewrevrefnamedobranch=$(gitrev-parse--symbolic--abbrev-ref$refname)if["master"=="$branch"];then#只对master分支的推送触发curl-XPOST-H"Content-Type:application/json"-d'{"ref":"$refname"}'http://10.0.0.23:9000/webhookfidone```4.赋予执行权限:```bashchmod+xpost-receive```###步骤3:在中转服务器(10.0.0.23)上设置Webhook接收服务我们需要一个简单的HTTP服务器来接收Webhook请求,然后触发同步脚本。这里可以使用Python的Flask框架(简单)或者其他任何你熟悉的HTTP服务器。1.安装Python和pip(如果未安装):```bashsudoaptupdatesudoaptinstallpython3python3-pip```2.安装Flask:```bashpip3installflask```3.创建一个目录存放我们的服务,比如`webhook-listener`:```bashmkdir~/webhook-listenercd~/webhook-listener```4.创建Flask应用文件`app.py`:```pythonfromflaskimportFlask,requestimportsubprocessapp=Flask(__name__)@app.route('/webhook',methods=['POST'])defwebhook():#可选的验证步骤(比如检查请求头中的token)#执行同步脚本subprocess.run(["/path/to/sync_script.sh"])return'OK',200if__name__=='__main__':app.run(host='0.0.0.0',port=9000)```5.将同步脚本的路径设置为实际路径(下面会写同步脚本)。6.运行这个服务(测试时可以直接运行,生产环境建议用守护进程,例如systemd服务):```bashnohuppython3app.py>webhook.log2>&1&```注意:确保端口9000在防火墙中开放。###步骤4:在中转服务器上编写同步脚本(使用rsync)1.创建同步脚本`sync_script.sh`:```bash#!/bin/bash#定义源路径(从中转服务器的哪个位置同步出去,这里可能需要先从中转服务器的git仓库拉取?)#但注意:中转服务器本身可能并不需要保存完整的代码,我们可以直接从中转服务器上的某个目录(比如webhook接收后拉取的临时目录)同步?#或者更常见的做法是:在中转服务器上克隆一份仓库,然后同步这个克隆仓库的最新版本。#我们可以在中转服务器上先克隆一份:REPO_PATH="/tmp/myrepo"REPO_URL="git@git-server-ip:/home/git/myrepo.git"TARGET_DIR="/tmp/deploy"#中转服务器上存放最新代码的位置#确保REPO_PATH存在if[!-d"$REPO_PATH"];thengitclone$REPO_URL$REPO_PATHfi#拉取最新代码cd$REPO_PATHgitpull#然后同步到两台Web服务器#注意:这里假设我们已经设置了从中转服务器到两台Web服务器的SSH免密登录#Web1(10.0.0.21)rsync-az--delete$REPO_PATH/user@10.0.0.21:/path/to/web/root/#Web2(10.0.0.22)rsync-az--delete$REPO_PATH/user@10.0.0.22:/path/to/web/root/#注意:替换user为Web服务器上的用户名,以及正确部署路径```2.给脚本执行权限:```bashchmod+xsync_script.sh```注意:这个脚本中,每次都会同步最新代码到两台服务器。但是,我们假设中转服务器上已经克隆了仓库。另外,我们可以考虑在同步前执行一些构建步骤(如npminstall等)。###步骤5:设置SSH免密登录(从中转服务器到两台Web服务器)1.在中转服务器上生成SSH密钥(如果没有):```bashssh-keygen```2.将公钥复制到Web服务器1和Web服务器2:```bashssh-copy-iduser@10.0.0.21ssh-copy-iduser@10.0.0.22```输入Web服务器上对应用户的密码。这样,rsync就可以无需密码直接同步了。###整体流程测试1.在本地向Git仓库推送代码(推送到master分支)。2.观察中转服务器的webhook监听服务日志(webhook.log)是否接收到请求。3.观察同步脚本是否执行,并检查两台Web服务器上是否有最新代码。安全提示:-在生产环境中,建议在Webhook的请求中添加Token验证,确保不是任意请求都能触发同步。-对于Git仓库服务器,应妥善保管SSH密钥,并限制访问。以上步骤完成后,应该就实现了自动化部署环境。注意事项:1.路径替换:脚本中的路径需要替换为实际路径。2.用户权限:确保git用户有访问仓库的权限,中转服务器上的用户有执行rsync的权限,以及Web服务器上的用户有写入部署目录的权限。§§相关问题§§1.如何确保Git仓库的安全?2.如果同步过程中出现网络中断,如何保证同步的完整性?3.如何对Webhook接收服务进行认证?4.除了rsync,还有其他同步代码的方法吗?5.如何优化这个部署流程以减少部署时间?</think> 以下是一个完整的自动化部署解决方案,涵盖Git仓库搭建、Webhook配置、中转服务器设置和rsync同步到两台Web服务器: --- ### **完整部署流程图** ```mermaid graph TD A[开发者推送代码] -->|触发| B[Git服务器] B -->|Webhook POST| C[中转服务器 10.0.0.23] C -->|rsync| D[Web1 10.0.0.21] C -->|rsync| E[Web2 10.0.0.22] ``` --- ### **步骤1:搭建Git仓库(Ubuntu)** ```bash # 安装Git sudo apt update sudo apt install git -y # 创建git用户 sudo adduser git sudo su - git mkdir -p ~/repos/myrepo.git cd ~/repos/myrepo.git git init --bare exit ``` --- ### **步骤2:配置Webhook钩子** 在Git仓库服务器操作: ```bash sudo su - git cat > ~/repos/myrepo.git/hooks/post-receive <<'EOF' #!/bin/bash while read oldrev newrev refname do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "$branch" = "master" ]; then curl -X POST http://10.0.0.23:8000/webhook -H "Content-Type: application/json" -d '{"ref":"'"$refname"'"}' fi done EOF chmod +x ~/repos/myrepo.git/hooks/post-receive ``` --- ### **步骤3:设置中转服务器(10.0.0.23)** #### 3.1 安装Webhook接收器(Python Flask) ```bash sudo apt install python3-pip pip3 install flask mkdir ~/webhook-handler && cd ~/webhook-handler cat > app.py <<'EOF' from flask import Flask, request import subprocess app = Flask(__name__) @app.route('/webhook', methods=['POST']) def handle_webhook(): if request.json.get('ref') == 'refs/heads/master': subprocess.call(['/usr/local/bin/sync_webservers.sh']) return '同步已触发', 200 return '忽略非master分支', 400 if __name__ == '__main__': app.run(host='0.0.0.0', port=8000) EOF # 启动服务(生产环境建议用systemd) nohup python3 app.py > webhook.log 2>&1 & ``` #### 3.2 创建同步脚本 ```bash sudo nano /usr/local/bin/sync_webservers.sh ``` ```bash #!/bin/bash REPO_PATH="/tmp/repo" WEB_SERVERS=("10.0.0.21" "10.0.0.22") # 清理并克隆最新代码 rm -rf $REPO_PATH git clone git@git-server-ip:/home/git/repos/myrepo.git $REPO_PATH # 同步到所有Web服务器 for server in "${WEB_SERVERS[@]}"; do rsync -az --delete -e ssh $REPO_PATH/ ubuntu@$server:/var/www/html/ done ``` ```bash sudo chmod +x /usr/local/bin/sync_webservers.sh ``` --- ### **步骤4:配置SSH免密登录** #### 4.1 在中转服务器生成密钥 ```bash ssh-keygen -t ed25519 -f ~/.ssh/deploy_key ``` #### 4.2 分发公钥到各服务器 ```bash # 复制公钥到Web服务器 ssh-copy-id -i ~/.ssh/deploy_key.pub ubuntu@10.0.0.21 ssh-copy-id -i ~/.ssh/deploy_key.pub ubuntu@10.0.0.22 # 复制公钥Git服务器(用于克隆) ssh-copy-id -i ~/.ssh/deploy_key.pub git@git-server-ip ``` #### 4.3 添加SSH配置 ```bash nano ~/.ssh/config ``` ```config Host git-server HostName git-server-ip User git IdentityFile ~/.ssh/deploy_key Host web1 HostName 10.0.0.21 User ubuntu IdentityFile ~/.ssh/deploy_key Host web2 HostName 10.0.0.22 User ubuntu IdentityFile ~/.ssh/deploy_key ``` --- ### **步骤5:验证部署** 1. **触发测试**: ```bash git commit --allow-empty -m "触发Webhook测试" git push origin master ``` 2. **检查日志**: ```bash # 在中转服务器 tail -f webhook.log # 在Web服务器 ls -l /var/www/html ``` --- ### **安全增强建议** 1. **Webhook认证**: ```python # 在app.py中添加 SECRET_TOKEN = "YOUR_SECRET" @app.route('/webhook', methods=['POST']) def handle_webhook(): if request.headers.get('X-Token') != SECRET_TOKEN: return '未授权', 401 ``` 2. **防火墙规则**: ```bash sudo ufw allow 8000/tcp # 中转服务器 sudo ufw allow 22/tcp # 所有服务器 ``` 3. **Git仓库权限控制**: ```bash sudo chown -R git:git /home/git/repos sudo chmod 750 /home/git/repos ``` --- ### **故障排除** 1. **Webhook未触发**: - 检查Git钩子权限:`ls -l /home/git/repos/myrepo.git/hooks` - 测试手动触发:`curl -X POST http://10.0.0.23:8000/webhook` 2. **rsync同步失败**: - 测试SSH连接:`ssh web1 ls /var/www/html` - 检查磁盘空间:`df -h` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值