Linux下Gitee实战:从SSH认证到WebHook自动化部署

发布时间:2026/10/19 9:08:00
Linux下Gitee实战:从SSH认证到WebHook自动化部署
不论你是刚把系统装成 Linux、准备搞开发还是已经用了一阵子但一直只用 GitHubGitee 在 Linux 下的使用都是值得认真捋一遍的事。很多人觉得码云无非就是国内版的 GitHub把网址换一下、命令照抄就行实际用下来坑不少认证方式不一样、仓库权限模型有差异、大文件存储得单独配、CI 构建规则也完全是另一套思路。这篇文章我就以平时在 Linux 终端里的真实操作为主线把这套流程从头到尾过一遍既讲命令怎么写也讲为什么这么写。先说清楚这篇文章适合谁刚接触 Linux、想在 Gitee 上托管代码的初学者能从零把环境搭起来跑通第一次 push已经有一定 Git 基础但没用过 Gitee 的开发者能避开我在实际使用中踩过的认证和分支保护相关的坑至于想在 Gitee 上做团队协作或者自动化部署的人后面几个章节也覆盖了 WebHook、Release 和 CI 的基础玩法。我尽量把命令、参数、排查思路都写得能直接复现不会绕弯子。1. 为什么在 Linux 上优先考虑 Gitee先聊几句背景。Linux 下用 Git 托管服务选择无非就是 GitHub、Gitee、自建 GitLab 这几类。GitHub 对国内网络环境不够友好clone 和 push 的速率经常不稳定这个属于客观情况自建 GitLab 维护成本高要单独一台机器跑、还得处理备份和升级Gitee 的优势在于仓库地址在国内终端里走 HTTPS 协议的时候连接速度明显更快而且很多开源项目在国内同步代码时都会把 Gitee 作为镜像站点。我自己实际测试过同一台服务器、同一个仓库往 Gitee push 的平均耗时大约是推送 GitHub 的三分之一到四分之一这个差距在频繁提交的时候体感很强。对国内公司的开发团队来说Gitee 还提供企业版支持私有仓库的成员权限管理、MRMerge Request评审流程、任务看板这些在 Linux 服务器上做自动化部署时非常实用。个人开发者则可以用免费版创建私有仓库虽然不是完全无限制但日常学习和作品集展示足够了。我在 Linux 下推荐 Gitee 还有一个原因它支持 SSH 协议的 git 连接方式这个跟 GitHub 的 SSH 方式几乎一致配置好公钥之后push 和 pull 都不需要反复输密码非常适合写脚本和配置定时任务。而且 Gitee 的 WebHook 功能可以直接向 Linux 服务器上的服务程序发送 POST 请求这对做自动化部署来说至关重要后面我会专门展开。2. 环境准备Linux 下的 Git 安装与基础配置2.1 安装 Git 并确认版本在开始操作 Gitee 之前得先保证 Linux 系统里已经装了 Git。不同发行版的包管理器命令不一样我平时接触比较多的是 Debian/Ubuntu 系和 CentOS/RHEL 系分别执行下面两条# Debian / Ubuntu sudo apt update sudo apt install -y git # CentOS / RHEL sudo yum install -y git如果是 Arch Linux那就是sudo pacman -S git。装完之后执行git --version我建议至少是 2.20 以上的版本太老的版本对 SSH 密钥格式、协议支持方面会有一些小问题。这里有个容易忽略的点刚装完的 Git 默认编辑器是 vi很多新手在 commit 的时候不小心进到 vi 界面里不知道怎么退出我一般会在全局配置里顺手改成 nano 或者 vim看个人习惯。2.2 配置用户名和邮箱Git 提交记录里会带上作者信息Gitee 的提交记录页也会根据这个信息来关联账号。这里说的用户名和邮箱不一定非要跟 Gitee 注册信息完全一致但为了提交记录能够正确在 Gitee 上显示头像和主页链接强烈建议保持一致。git config --global user.name 你的用户名 git config --global user.email 你的邮箱example.com可以用git config --list来检查当前生效的配置。这里有个细节--global是写入~/.gitconfig文件而每个仓库还可以有自己的.git/config优先级是仓库级配置高于全局配置。如果你的某个项目里需要以不同的身份提交比如公司的仓库用公司邮箱可以在仓库目录内单独执行一次git config user.name和git config user.email不添加--global参数就行。我在实际工作中就遇到过忘记改局部配置导致提交记录跑到旧账号下的情况查起来很费劲。2.3 设置默认分支名和换行符处理Gitee 上新建仓库时默认分支名是 master但很多新项目已经转向 main。为了减少不必要的麻烦我会在全局配置里设置默认分支名git config --global init.defaultBranch main还有一个绕不开的问题是换行符。Windows 环境下 Git 默认会做 CRLF 转换Linux 下默认是 LF。如果你在 Linux 上拉取一个 Windows 开发者维护的仓库经常会出现“整个文件都显示被修改”的错觉其实就是换行符变了。我建议 Linux 用户明确设置git config --global core.autocrlf inputinput的含义是提交时把 CRLF 转成 LFcheckout 时不转换这符合 Linux 端的习惯也能避免仓库里混入大量不统一的换行符。3. 认证配置从 HTTPS 密码到 SSH 密钥的完整切换这一节是重点也是很多人在 Linux 下第一次用 Gitee 时最容易卡住的地方。3.1 HTTPS 方式与时区差异的坑最开始接触 Gitee最省事的做法是走 HTTPS 协议git clone https://gitee.com/用户名/仓库名.git但新手往往会在这里撞上第一个坑Gitee 很早就不再支持在终端里直接用账号密码进行 HTTPS 认证了而是要求使用私人令牌Personal Access Token。当你输入用户名之后密码那一栏要填的不是 Gitee 登录密码而是去 Gitee 网页端生成的私人令牌。这个设计跟 GitHub 一致主要是为了安全考虑防止密码在第三方平台被记录。生成路径是Gitee 网页右上角头像 - 设置 - 安全设置 - 私人令牌 - 生成新令牌。生成的时候可以选择令牌权限我一般建议只勾选projects权限里的读写即可不要图省事直接全选。拿到令牌之后复制保存好因为它只显示一次。如果不想每次 push 都输入令牌可以在 Linux 上启用 Git 凭据存储git config --global credential.helper store这会把令牌明文存到~/.git-credentials文件里对个人电脑来说问题不大但在服务器上这么做相当于把钥匙放在了进门垫子下面自己权衡。更稳妥的方式是用credential.helper cache设定过期时间git config --global credential.helper cache --timeout3600不过说实话在 Linux 上我最终推荐的是 SSH 方式长期使用更省心。3.2 生成 SSH 密钥对并添加公钥SSH 方式的核心是密钥对。生成命令如下ssh-keygen -t ed25519 -C 你的邮箱example.com我推荐使用 ed25519 算法比传统的 RSA 更安全、更短而且 Gitee 完全支持。如果出于某些原因必须用 RSA可以换成ssh-keygen -t rsa -b 4096 -C 你的邮箱。生成过程中会让你选择保存路径默认是~/.ssh/id_ed25519直接回车即可。如果该路径下已有同名文件会提示是否覆盖务必确认这是不是你需要保留的密钥。接着会让你设置 passphrase也就是私钥的解锁密码。为了安全性建议设置一个但在服务器或者自动化脚本里设置了 passphrase 会导致 push 时需要手动输入密码反而不方便。我个人的做法是个人开发机设置 passphrase服务器上生成专属密钥不设 passphrase并且限制该服务器的用途只作为一个受控的部署账号。生成完成后查看公钥内容cat ~/.ssh/id_ed25519.pub复制输出的一整行格式是ssh-ed25519开头的一串。然后打开 Gitee 网页端头像 - 设置 - 安全设置 - SSH 公钥 - 添加公钥粘贴进去标题可以随便填方便自己认出来是哪台机器。3.3 测试 SSH 连接添加好公钥后在终端验证一下ssh -T gitgitee.com如果看到欢迎信息类似 Hi 用户名! Youve successfully authenticated, but GITEE.COM does not provide shell access.说明 SSH 认证已经通了。如果你在服务器上测试时提示权限拒绝多半是公钥没粘贴完整或者粘贴时多了空格换行。另外一个容易被忽略的点是SSH 客户端的默认端口是 22Gitee 服务器如果响应慢可以尝试配置走端口 443# 在 ~/.ssh/config 中添加 Host gitee.com HostName gitee.com User git Port 443这个配置偶尔能绕过某些网络环境下对 22 端口的限制属于实战小技巧我在远程办公室网络下遇到过可以用 443 连上但 22 连不上的情况。3.4 切换 remote 地址SSH 配置好之后需要把本地仓库的远程地址从 HTTPS 切换成 SSH或者直接 clone 时就用 SSH 地址。Gitee 仓库主页右上角有一个克隆/下载按钮下拉列表里有 HTTP 和 SSH 两种地址。SSH 地址的格式是gitgitee.com:用户名/仓库名.git如果你已经用 HTTPS 克隆了仓库切换方法git remote set-url origin gitgitee.com:用户名/仓库名.git查看确认git remote -v这会儿你会看到 origin 指向 SSH 地址。之后再进行 push 和 pull 就不再需要输入密码了。4. 日常操作全流程从克隆到推送的完整工作流配置完成就可以进入日常的开发循环了。这一节我从具体命令和操作习惯两个层面来讲尤其会强调分支管理和提交信息规范因为这是团队协作中最容易出问题的地方。4.1 克隆仓库与工作目录初始化如果是从零开始最直接的方式是git clone gitgitee.com:用户名/仓库名.git cd 仓库名克隆完成后仓库目录下会有.git隐藏目录所有的版本历史都在里面。这里补充一个有用的参数如果你只想要某个分支或者只想要最新一版的代码而不需要历史可以加--depth 1git clone --depth 1 gitgitee.com:用户名/仓库名.git这个浅克隆写法在拉一个大仓库的时候能明显节省时间特别适合只需要在服务器上部署、不需要完整历史记录的场景。如果你是先在本地创建了项目希望推送到 Gitee 上的空仓库操作顺序是mkdir 项目名 cd 项目名 git init git add . git commit -m 初始提交 git remote add origin gitgitee.com:用户名/项目名.git git push -u origin main这里有一个新手的经典误区git add .会把当前目录下所有文件都加进去包括了一些编译产物、临时文件、IDE 配置等。正确做法是先在项目根目录创建.gitignore文件把不需要纳入版本控制的目录和文件排除掉。我在 Linux 下最常见的场景是 Python 项目的__pycache__、*.pycNode 项目的node_modules以及各类 IDE 的.idea/.vscode目录。这些如果不忽略后续每次git status都会看到一堆乱七八糟的变更。4.2 日常提交status、add、commit 的组合节奏在 Linux 终端下工作的好处是Git 命令可以跟其他命令行工具完美配合。我的日常节奏是写代码时频繁使用git status查看变更确定要提交哪些文件再git add然后提交并推送git status git add 具体文件或目录 git commit -m feat: 添加用户登录接口 git push origin 当前分支名提交信息这一块我强烈建议遵循一个简单的规范前缀表达类型正文描述内容。比如fix:表示修复 Bugfeat:表示新功能docs:表示文档变更refactor:表示重构。这样在查看提交历史时一眼就能看出每个提交的性质配合 Gitee 的提交记录页面能快速定位问题。这里有个经验不要用git commit -m去写超长的说明如果提交信息需要分段直接用git commit打开编辑器来写格式更清晰。Gitee 的 push 默认可能被分支保护规则限制如果你在 Push 时报错 remote rejected大概率是目标分支设置了保护不允许直接提交。这个在团队的仓库里很常见个人仓库则不会遇到后面章节我会单独说。4.3 分支操作与合并策略分支是 Git 的核心优势。在 Linux 下我常用的分支命令git branch # 查看本地分支 git branch 新分支名 # 创建新分支 git checkout 新分支名 # 切换到新分支 git switch -c 新分支名 # 创建并切换Git 2.23 推荐 git branch -d 分支名 # 删除分支合并分支的标准动作git checkout main git pull origin main git merge 功能分支名 git push origin main在 Gitee 上操作分支时还有一个网页端强相关的功能叫 Pull RequestGitee 里叫 Pull Request缩写 PR。当你把功能分支推到 Gitee 远端的仓库后可以去网页端发起一个 PR让代码评审人看变更、评论、然后再合并到主分支。相比在本地直接把分支合并到 main 再 pushPR 流程的优势在于有审查记录、有讨论痕迹出了问题能追溯。个人项目也许觉得这股流程太重但团队项目强烈建议走 PR不要直接把 main 分支当作个人开发分支乱推。4.4 拉取最新代码fetch 与 pull 的区别日常操作里还经常遇到git pull和git fetch。很多新手会混淆这两个命令。简单来说git fetch只是把远端的新提交下载到本地仓库但不会修改你当前的工作目录和分支指向git pull等于git fetch加git merge它会把远端的新提交直接合并进当前分支。在团队协作中我建议先用git fetch看远端变化确认不会产生冲突再去 pull尤其是多人同时修改同一个文件时直接 pull 很容易进入合并冲突界面。如果 pull 的时候发现有冲突冲突文件里会出现类似 HEAD 当前分支的内容 远端分支的内容 origin/main这时候需要手动编辑文件保留希望的内容删除冲突标记然后重新git add和git commit。在 Linux 终端里处理冲突不如图形化工具直观但操作熟练后效率极高。Vim 或其他编辑器配合搜索功能定位就能逐个处理也可以用git mergetool调用可视化工具但我个人在服务器环境下更习惯手动处理因为服务器上通常没装图形界面。5. 仓库管理进阶Gitee 的 Releases、Pages 与 WebHook日常的 Git 命令掌握之后Gitee 还提供几个跟 Linux 使用场景深度相关的高级功能值得认真说。5.1 通过 Releases 管理版本产物Gitee 的 Releases 功能本质上是一个文件存储和发布系统。你可以在网页端手动上传编译打包好的文件比如app.tar.gz、config.yaml、installer.run给它们打上版本号v1.0.0然后在 Linux 服务器上用wget直接拉取wget https://gitee.com/用户名/仓库名/releases/download/v1.0.0/app.tar.gz这个用法在自动化部署脚本里非常实用因为 Release 文件的下载地址是稳定的只要打新版本号就不会覆盖旧文件。对比之下如果你把编译产物直接推到仓库的某个分支里会让仓库体积迅速膨胀而且每次拉取都要把整个历史下载一遍非常低效。我在实际项目中习惯用一个简单的脚本在 Linux 下自动打包并通过 Gitee 的 API 上传到 Release# 先计算文件的 SHA256 校验值 sha256sum dist/app.tar.gz然后调用 Gitee 的 Open API 创建 Release 并上传附件。具体 API 的使用在官方文档里有详细说明我这里不展开每一个参数只提醒一点调用 API 需要用到私人令牌跟前面生成的那个一致权限需要勾选projects的写入权限。这种方式特别适合要做定时发布或者 CI 集成的团队避免每次都要人工网页上传。5.2 使用 Gitee Pages 部署静态站点Gitee Pages 是 Gitee 提供的静态网站托管服务。适合部署个人博客、项目文档站点、纯前端的演示页面。它的用法很直观在仓库中放入静态文件HTML/CSS/JS 或者由文档工具生成的静态站点然后在 Gitee 网页端进入仓库 服务 Gitee Pages选择部署分支和目录点一下启动稍等片刻就能在 Gitee 分配的域名上访问到你的站点。在 Linux 下与 Pages 配合最常用的场景是用 MkDocs 或 VuePress 这类文档工具在本地构建静态网站然后把生成站点目录的产物推送到仓库的gh-pages分支或者你指定的分支。这里有几个实际使用中必须注意的细节Gitee Pages 的免费套餐在部署时会重新编译一次如果你使用的是自定义域名需要先在网页端配置好否则会出现访问域名不一致的问题。仓库如果包含敏感信息千万不要部署到 Pages 上私有仓库的 Pages 服务有访问控制但公开部署的内容就是人人可见。静态站点的资源均为相对路径引用时在子目录部署才不会乱如果你直接把构建产物放在仓库根目录且没有设置正确的 base 路径CSS 和 JS 经常 404。我刚开始用 VuePress 时就在这里栽过后来统一在配置文件里把 base 设置成仓库名加斜杠。5.3 WebHook 与服务器自动化联动WebHook 是 Gitee 与 Linux 服务器自动化的一个桥梁。原理很简单你在 Gitee 上给某个仓库配置一个 WebHookURL 指向你的 Linux 服务器上的某个服务接口当仓库发生指定事件比如 push、提交 PR、创建 Release时Gitee 会向这个 URL 发起一个 HTTP POST 请求请求体里有仓库、提交人、提交信息等数据。在 Linux 上最常见的应用是自动部署当你推送到远程 main 分支时Gitee 触发 WebHook你的服务器收到请求后执行一个部署脚本把最新的代码拉下来重启服务。这个链路看似简单真正在生产环境里跑起来有三大注意事项第一WebHook 的 URL 必须能被 Gitee 公网访问到。如果你的服务器在 NAT 后面、没有公网 IP可以用内网穿透工具或者干脆部署在云端服务器上但穿透工具的选择不在本文讨论范围内。第二光收到 POST 还不够消息体是 JSON 格式你需要解析字段来判断这次推送的分支是哪个。我的习惯是用 Python 的 Flask 或 Node.js 的 Express 写一个小服务收到请求后判断 branch 字段是否为refs/heads/main是才执行部署脚本。第三一定要在服务端校验 Gitee 请求的签名或者至少校验一个自定义 Token 字段否则任何知道 URL 的人都可以触发你的部署脚本有安全风险。6. 团队协作与权限体系解析到这里单人的使用方法基本完整。但 Gitee 在 Linux 下最有价值的应用场景之一还是团队协作这一节把权限模型和几个常见的协作坑讲透。6.1 角色权限从访客到管理员的层级差异Gitee 仓库的成员角色分为几个层级访客、开发者、管理员、所有者。不同角色的权限差异直接影响你在 Linux 下的 Git 操作范围。访客只能查看和克隆公开仓库不能 push。开发者可以 clone、pull、push也可以创建分支适合日常开发人员。管理员在开发者基础上可以管理仓库设置、成员权限以及分支保护规则。所有者是仓库的创建者权限最高包括删除仓库的操作但也有额外的保护限制。如果你在 push 时收到permission denied的报错且 SSH 认证已通过大概率是你的账号在仓库成员角色列表里是访客级别需要让管理员提升权限。这个问题在团队里经常出现新人加入后管理员忘记添加为开发者一上午都会卡在 push 环节。6.2 分支保护与 Code Review 的落地Gitee 的分支保护规则值得认真配置。在仓库的“管理”选项里可以设置受保护分支对 main 分支启用保护后通常会有这些约束不允许直接推送必须通过 Pull Request 合并要求 PR 至少经过一个评审人批准才能合并还可以设置不要强制推送。这些规则对 Linux 终端的使用习惯来说是一个很关键的调整直接git push origin main会失败但如果你 checkout 一个新分支、提交后 push 新分支再到网页端发起 PR一切就顺理成章了。我建议团队的每个成员都习惯这样的流程而不是为了省事关掉分支保护。还有一个细节Gitee 的合并方式有 merge commit 和 squash 两种。squash 方式会将整个 PR 的所有提交合并成一个提交历史更干净merge commit 保留完整开发历史。如果团队追求简洁的提交历史建议统一用 squash否则分支合并后可能有一堆Merge branch feature into main的噪音提交。6.3 多仓库与 Fork 工作流Gitee 上参与开源项目时常见的工作流是 Folk。你无法直接往别人仓库的 main 分支 push所以把别人的仓库 Fork 到自己账号下得到一个副本仓库然后git clone gitgitee.com:你的用户名/原仓库名.git cd 原仓库名 git remote add upstream gitgitee.com:原作者用户名/原仓库名.git这里加了名为upstream的远程地址指向原作者的官方仓库。之后你可以从upstream拉取最新代码git pull upstream main再把你自己修改的分支 push 到origin即你的 Fork 仓库最后在 Gitee 网页端从你的 Fork 分支向原仓库发起 Pull Request。这是开源项目贡献的标准流程也适用于公司内部采用“集中式 个人 Fork”模式的团队。注意Fork 出来的仓库默认是原仓库的快照需要经常同步 upstream 的最新代码不然你的 PR 可能因为冲突迟迟无法合并。7. 常见问题排查与实战速查表这一节整理我在 Linux 下使用 Gitee 时遇到的频率最高的几个问题给出排查思路和解决命令希望你能直接复制操作。7.1 SSH 认证失败与权限拒绝现象执行ssh -T gitgitee.com时提示Permission denied (publickey)或者 push 时报gitgitee.com: Permission denied (publickey)。优先按以下顺序排查# 1. 查看本地是否有私钥文件 ls -l ~/.ssh/ # 2. 查看 SSH agent 是否加载了密钥 ssh-add -l # 3. 如果密钥文件存在但 agent 没有加载手动加载 ssh-add ~/.ssh/id_ed25519 # 4. 使用详细模式测试观察输出 ssh -vT gitgitee.com如果~/.ssh下根本没有密钥文件说明之前没有生成过需要回到 3.2 节重新生成。另一个常见的隐藏坑是系统里存在多个私钥文件SSH 默认使用~/.ssh/id_rsa或id_ed25519如果你用的密钥文件名不是默认名字需要在~/.ssh/config里配置IdentityFile来指定。7.2 Push 被拒绝remote rejected原因通常是分支保护规则。处理方式是用git fetch拉取最新检查目标分支是否配置了保护或者把当前分支推送到一个新的分支再发起 PR。还有一种情况是本地的分支和远程分支历史不一致出现non-fast-forward的报错这代表远端有本地没有的提交。解决办法是先拉取合并git pull origin main --rebase git push origin main--rebase比默认的 merge 方式更适合个人开发分支它会把本地提交“垫”到远端最新提交之上避免产生无意义的合并提交。需要注意的是rebase 会改写本地提交历史在已经 push 过的公共分支上慎用。7.3 中文文件名或内容乱码在 Linux 下从 Gitee 克隆的仓库如果遇到中文文件名显示成转义序列\345\274\240可以这样设置git config --global core.quotepath false这个配置让 Git 在输出文件名时不使用八进制转义保持中文可读。内容乱码的情况通常是文件本身的编码问题跟 Gitee 无关但建议团队统一使用 UTF-8 编码并在.gitattributes里声明* textauto7.4 大文件与仓库体积膨胀如果仓库里需要存放大文件比如二进制模型包、设计稿、视频素材直接把文件提交进 Git 仓库会使得.git目录越来越大每次 clone 都费时费力。Gitee 有专门的大文件存储功能思路类似 Git LFSLarge File Storage也就是把大文件的指针提交到仓库而实际文件内容存到独立的存储服务中。在 Linux 上的使用方式git lfs install git lfs track *.tar.gz git add .gitattributes git add 文件路径 git commit -m 添加大文件 git push origin main关键点是最一开始就先git lfs track再添加文件否则已经常规提交进历史的大文件不会自动转移。仓库膨胀之后要清理历史记录会非常麻烦所以我建议在项目启动第一天就约定大文件的存放策略。7.5 常用问题速查表现象可能原因排查/解决命令SSH 认证失败公钥未添加或私钥未加载ssh -vT gitgitee.com确认公钥已粘贴到 Giteepush 提示权限不足账号角色太低联系仓库管理员提升为开发者push 被拒绝 non-fast-forward本地落后于远端git pull --rebase后重新 push中文文件名乱码默认转义git config --global core.quotepath false仓库体积过大大文件直接入库改用 Gitee 大文件存储或 Release 附件clone 速度慢网络环境或仓库太大尝试浅克隆--depth 18. Linux 服务器上的自动化部署实践很多人在 Linux 下用 Gitee终极目标是实现代码提交后服务器自动拉取、自动构建、自动重启服务。我用一个基于 WebHook 的完整例子来演示这个链路这也算是对前文知识的一次串联。8.1 用 Flask 写一个简单的 WebHook 接收端假设你有台服务器部署了一个简单的 Python Web 服务目录是/opt/myapp希望通过 Gitee 的 push 事件自动更新代码。先在服务器上写一个 Flask 服务# /opt/webhook/app.py from flask import Flask, request, jsonify import subprocess, hmac, hashlib, os app Flask(__name__) # 这个 secret 要和 Gitee WebHook 配置中的 secret 保持一致 SECRET your-custom-secret app.route(/webhook, methods[POST]) def handle_webhook(): signature request.headers.get(X-Gitee-Token, ) payload request.get_data() # 简单校验自定义 token 字段也可以按 Gitee 的签名规则校验 if signature ! SECRET: return jsonify({status: forbidden}), 403 data request.get_json() branch (data.get(ref) or ).replace(refs/heads/, ) repo_name data.get(repository, {}).get(name, ) if branch main and repo_name myapp: # 执行部署脚本这里用 nohup 避免阻塞 HTTP 响应 subprocess.Popen([/opt/myapp/deploy.sh]) return jsonify({status: ok}), 200 return jsonify({status: ignored}), 200 if __name__ __main__: app.run(host0.0.0.0, port9000)然后写部署脚本/opt/myapp/deploy.sh#!/bin/bash cd /opt/myapp git pull origin main pip install -r requirements.txt systemctl restart myapp给脚本添加执行权限chmod x /opt/myapp/deploy.sh。8.2 配置 Gitee WebHook 并测试在 Gitee 仓库的管理页面找到 WebHook 配置项填入 URLhttp://你的服务器IP:9000/webhookSecret 设置成上面对应的your-custom-secret事件按需勾选 push。保存之后在本地随便提交一次并 push 到 main 分支服务器会自动收到请求。检查 Flask 的日志确认请求进来了再检查部署脚本是否执行最终验证服务是否已经更新到最新代码。这个流程上线后你就不再需要每次手动 SSH 到服务器执行git pull了。配合前面讲的 Release 功能甚至可以把编译产物通过 API 上传到 Gitee Release然后 WebHook 触发服务器去下载产物并解压部署实现完整的自动发布链路。8.3 定时同步 Gitee 仓库到服务器如果 WebHook 这种方式因为网络原因不稳定退而求其次的方案是用 Linux 的 cron 定时任务定期拉取 Gitee 仓库。在crontab -e中添加*/5 * * * * cd /opt/myapp git pull origin main /var/log/myapp-sync.log 21这个方案简单可靠缺点是存在最长 5 分钟的延迟不适合需要即时发布的场景。另外定时任务里必须注意 Git 命令在脚本中的权限问题通常需要指定-C参数或者在脚本里先cd到仓库目录。9. 一些最后想分享的操作习惯讲完上面的所有流程最后分享几个我踩过坑之后养成的操作习惯算不上教程但确实能帮你少走弯路。第一个习惯是每次新装 Linux 系统后第一时间把 Git 全局配置和 SSH 密钥配置好。不要等到真正要推代码时才想起来到时候又是一轮找密钥、加公钥的折腾。配置文件的备份也很重要我会把~/.ssh/config、~/.gitconfig纳入自己的 dotfiles 仓库管理换机器时一条命令就能恢复环境。第二个习惯是 commit 信息里尽量带上可追溯的编号。比如如果是某个需求或者 Bug 修复在信息里带上项目管理系统的编号例如fix: #123 登录接口超时问题。Gitee 的提交记录页面支持对 commit 的检索编号信息能让后续排查问题定位变更时省很多力气。第三个习惯是谨慎处理.gitignore。新手常常忽略它等到把密钥文件、数据库配置、敏感日志都推上去了才后悔。我建议在项目最开始就配置好之后再发现漏了什么东西哪怕推错了也要立即从远程仓库删除并清理历史而不是简单提交一个新 commit 假装没发生。撤销提交历史的操作要非常熟练但更重要的是预防。第四个习惯是对大仓库的浅克隆要有敬畏心。在 Linux 服务器上部署时我通常会考虑是否真的需要完整历史如果只是运行代码浅克隆加定时拉取是最高效的组合但如果是需要基于历史做排查浅克隆会带来麻烦。这种情况不要省。我在实际使用 Gitee 的过程中体会最深的一点是工具本身不难难的是把配置、权限、协作流程和自动化链路一次想清楚。很多坑其实在第一次配置时花五分钟就能避开但大多数人都是等到 push 被拒绝、服务器更新错误、历史被污染之后才回头补课。希望这一篇能帮你把 Gitee 和 Linux 这套组合真正用顺少走点弯路。