Py学习  »  Git

Git 运维实战:基础设施即代码版本控制从零到生产级方案

马哥Linux运维 • 2 周前 • 153 次点击  

Git 运维实战:基础设施即代码版本控制从零到生产级方案

适用场景 & 前置条件

  • • 适用场景:配置管理、IaC (Terraform/Ansible)、脚本版本化、CI/CD 流水线、多人协作运维
  • • 操作系统:RHEL/CentOS 7.x-9.x、Ubuntu 18.04-24.04
  • • 权限要求:普通用户(推荐),仓库管理需 Git 服务器权限
  • • 依赖工具:git 2.20+、SSH 客户端、GPG (可选签名)
  • • 前置知识:Linux 基础命令、文本编辑器使用

环境与版本矩阵

组件
RHEL/CentOS
Ubuntu/Debian
推荐版本
Git 版本
2.31+ / 2.43+
2.34+ / 2.43+
2.40+ (LTS)
SSH
OpenSSH 8.0+
OpenSSH 8.2+
最新稳定版
GPG
2.2.20+
2.2.27+
2.3+ (可选)
Git 托管平台
GitLab CE
GitLab CE
GitLab 16.x
备选平台
Gitea
Gitea
Gitea 1.21+

快速清单(Checklist)

  1. 1. 安装与初始化配置 (身份、编辑器、别名)
  2. 2. SSH 密钥认证配置 (免密推送)
  3. 3. 创建运维仓库 (目录结构规范)
  4. 4. 常用工作流 (提交/分支/合并)
  5. 5. 敏感数据管理 (.gitignore + git-crypt)
  6. 6. 多环境分支策略  (dev/staging/prod)
  7. 7. 配置文件模板化 (变量替换)
  8. 8. 自动化部署集成 (Git Hooks)
  9. 9. 备份与恢复机制 (裸仓库备份)
  10. 10. 审计与合规 (签名提交 + 日志审计)

实施步骤

Step 1: 安装与初始化配置

RHEL/CentOS 安装:

# RHEL 8/9 自带 Git 2.31+
sudo yum install -y git

# CentOS 7 需启用 EPEL 获取新版本
sudo yum install -y epel-release
sudo yum install -y git222  # Git 2.22

Ubuntu/Debian 安装:

# Ubuntu 22.04+ 自带 Git 2.34+
sudo apt update
sudo apt install -y git

# 安装最新版(通过 PPA)
sudo add-apt-repository ppa:git-core/ppa -y
sudo apt update
sudo apt install -y git

验证安装:

git --version

全局配置(必需):

# 用户身份(影响提交记录)
git config --global user.name "Ops Team"
git config --global user.email "ops@example.com"

# 默认编辑器
git config --global core.editor vim

# 彩色输出
git config --global color.ui auto

# 默认分支名(新仓库)
git config --global init.defaultBranch main

# 拉取策略(避免不必要的合并提交)
git config --global pull.rebase true

查看配置:

git config --list --show-origin

Step 2: SSH 密钥认证配置

生成 SSH 密钥对:

# 推荐使用 Ed25519 算法(性能高/安全)
ssh-keygen -t ed25519 -C "ops@example.com" -f ~/.ssh/id_ed25519_git

# 备选 RSA 4096(兼容老系统)
ssh-keygen -t rsa -b 4096 -C "ops@example.com" -f ~/.ssh/id_rsa_git

配置 SSH 客户端:

cat >> ~/.ssh/config <<'EOF'
Host gitlab.example.com
  HostName gitlab.example.com
  User git
  IdentityFile ~/.ssh/id_ed25519_git
  IdentitiesOnly yes
  StrictHostKeyChecking accept-new
EOF

chmod 600 ~/.ssh/config

上传公钥到 Git 平台:

# 显示公钥(复制内容到 GitLab/GitHub 设置页)
cat ~/.ssh/id_ed25519_git.pub

验证连接:

ssh -T git@gitlab.example.com

预期输出:

Welcome to GitLab, @ops!

Step 3: 创建运维仓库

标准目录结构:

mkdir -p ~/ops-repo && cd ~/ops-repo

# 初始化仓库
git init

# 创建目录结构
mkdir -p {ansible/{inventories,playbooks,roles},scripts/{backup,monitoring},terraform/{modules,environments},docs}

# 创建初始文件
cat > README.md <<'EOF'
# 运维配置仓库

## 目录说明
- `ansible/`:Ansible 配置管理
- `scripts/`:运维脚本(备份/监控/部署)
- `terraform/`:基础设施即代码
- `docs/`:运维文档与 Runbook
EOF

# 创建 .gitignore(见 Step 5)
cat > .gitignore <<'EOF'
# 敏感信息
*.key
*.pem
*.p12
*.env
*_rsa*
secrets.yml
vault-password.txt

# 临时文件
*.log
*.tmp
*.swp
.terraform/
.terraform.lock.hcl

# IDE 配置
.vscode/
.idea/
EOF

首次提交:

git add .
git commit -m "Initial commit: 初始化运维仓库结构"

关联远程仓库:

# 在 GitLab 创建空仓库后执行
git remote add origin git@gitlab.example.com:ops/ops-repo.git
git push -u origin main

Step 4: 常用工作流

场景 1:修改 Nginx 配置

工作流程:

# 1. 拉取最新代码
cd ~/ops-repo
git pull

# 2. 创建功能分支
git checkout -b feature/nginx-tuning

# 3. 编辑配置文件
vim ansible/playbooks/nginx-config.yml

# 4. 查看差异
git diff

# 5. 暂存修改
git add ansible/playbooks/nginx-config.yml

# 6. 提交(清晰描述)
git commit -m "feat: 优化 Nginx worker 连接数配置

- 调整 worker_connections 为 4096
- 启用 TCP_NODELAY 优化
- 适用环境:生产 Web 集群"

# 7. 推送到远程
git push -u origin feature/nginx-tuning

代码审查与合并:

# 在 GitLab 创建 Merge Request
# 审查通过后,合并到 main 分支

# 本地同步
git checkout main
git pull
git branch -d feature/nginx-tuning  # 删除本地分支

场景 2:紧急修复(Hotfix)

# 1. 从生产分支创建修复分支
git checkout prod
git checkout -b hotfix/disk-alert-threshold

# 2. 快速修复
echo"DISK_THRESHOLD=85" > scripts/monitoring/disk-check.conf
git add scripts/monitoring/disk-check.conf
git commit -m "fix: 磁盘告警阈值从 95% 降至 85%"

# 3. 合并回生产分支
git checkout prod
git merge --no-ff hotfix/disk-alert-threshold

# 4. 同步到开发分支
git checkout main
git merge --no-ff hotfix/disk-alert-threshold

# 5. 清理分支
git branch -d hotfix/disk-alert-threshold

场景 3:查看历史与回退

# 查看提交历史(图形化)
git log --oneline --graph --all --decorate

# 查看特定文件历史
git log -p -- ansible/playbooks/nginx-config.yml

# 查看某次提交详情
git show

# 回退到上一个版本(保留修改)
git reset --soft HEAD~1

# 完全回退(丢弃修改,危险!)
git reset --hard

# 撤销特定提交(生成反向提交)
git revert

Step 5: 敏感数据管理

方案 1:.gitignore(预防)

运维场景模板:

cat > .gitignore <<'EOF'
# 密钥与证书
*.key
*.pem
*.crt
*.p12
*.jks
*_rsa
*_ecdsa
id_*

# 密码与令牌
*.env
.env.*
secrets.yml
credentials.yml
vault-password*
*token*

# 云平台凭证
.aws/credentials
.azure/credentials
.kube/config

# Terraform 敏感状态
*.tfstate
*.tfstate.backup
.terraform/

# Ansible Vault(加密例外)
!*vault*.yml

# 临时与日志
*.log
*.tmp
*.bak
EOF

检查是否误提交敏感文件:

git status --ignored

方案 2:git-crypt(加密)

安装 git-crypt:

# RHEL/CentOS
sudo yum install -y git-crypt

# Ubuntu/Debian
sudo apt install -y git-crypt

初始化加密:

cd ~/ops-repo
git-crypt init

# 配置加密文件(.gitattributes)
cat > .gitattributes <<'EOF'
secrets.yml filter=git-crypt diff=git-crypt
ansible/vault-password.txt filter=git-crypt diff=git-crypt
*.env filter=git-crypt diff=git-crypt
EOF

git add .gitattributes
git commit -m "chore: 启用 git-crypt 加密敏感文件"

导出解密密钥(备份!):

git-crypt export-key /secure/path/git-crypt-key
chmod 400 /secure/path/git-crypt-key

团队成员解锁:

git clone git@gitlab.example.com:ops/ops-repo.git
cd ops-repo
git-crypt unlock /secure/path/git-crypt-key

Step 6: 多环境分支策略

推荐策略(GitFlow 简化版):

main (开发)
  ├── staging (预发布)
  └── prod (生产)

创建分支:

# 基于 main 创建 staging
git checkout -b staging main
git push -u origin staging

# 基于 staging 创建 prod
git checkout -b prod staging
git push -u origin prod

工作流:

# 开发 → 测试 → 预发布 → 生产

# 1. 开发分支合并到 staging
git checkout staging
git merge --no-ff main
git push

# 2. 预发布验证通过后,合并到 prod
git checkout prod
git merge --no-ff staging
git tag -a v1.2.3 -m "Release 1.2.3: Nginx 性能优化"
git push --tags

保护分支(GitLab 设置):

  • • prod 分支:仅维护人员可推送,需 MR 审批
  • • staging 分支:开发团队可推送
  • • main 分支:所有提交需通过 MR

Step 7: 配置文件模板化

使用场景:不同环境的参数差异

模板文件(template):

# ansible/templates/nginx.conf.j2
worker_processes {{ nginx_worker_processes }};
worker_connections {{ nginx_worker_connections }};

upstream backend {
    {% for host in backend_servers %}
    server {{ host }}:8080;
    {% endfor %}
}

环境变量文件:

# ansible/inventories/production/group_vars/all.yml
nginx_worker_processes: 8
nginx_worker_connections: 4096
backend_servers:
  - 10.0.1.10
  - 10.0.1.11
  - 10.0.1.12

# ansible/inventories/staging/group_vars/all.yml
nginx_worker_processes: 2
nginx_worker_connections: 1024
backend_servers:
  - 10.0.2.10

版本控制要点:

  • • 模板文件提交到仓库
  • • 环境变量文件按目录隔离
  • • 生产密钥使用 Ansible Vault 加密

Step 8: 自动化部署集成(Git Hooks)

场景:推送到 prod 分支自动部署

服务器端钩子(Git 服务器):

# /var/opt/gitlab/git-data/repositories/ops/ops-repo.git/hooks/post-receive
#!/bin/bash

whileread oldrev newrev refname; do
if [[ "$refname" == "refs/heads/prod" ]]; then
echo"检测到 prod 分支更新,触发部署..."

# 克隆到临时目录
    DEPLOY_DIR="/tmp/deploy-$(date +%s)"
    git clone /var/opt/gitlab/git-data/repositories/ops/ops-repo.git "$DEPLOY_DIR"
cd"$DEPLOY_DIR"
    git checkout prod

# 执行部署脚本
    ansible-playbook -i ansible/inventories/production ansible/playbooks/deploy.yml

# 清理
rm -rf "$DEPLOY_DIR"
fi
done

客户端钩子(本地提交检查):

# ~/ops-repo/.git/hooks/pre-commit
#!/bin/bash

# 检查是否误提交密钥文件
FORBIDDEN_FILES=$(git diff --cached --name-only | grep -E '\.(key|pem|env)$')

if [ -n "$FORBIDDEN_FILES" ]; then
echo"错误:检测到敏感文件,拒绝提交!"
echo"$FORBIDDEN_FILES"
exit 1
fi

# 检查 YAML 语法
for file in $(git diff --cached --name-only | grep '\.ya\?ml$'); do
  yamllint "$file" || exit 1
done

exit 0

激活钩子:

chmod +x .git/hooks/pre-commit

Step 9: 备份与恢复机制

裸仓库备份(推荐):

# 克隆裸仓库(包含所有历史)
git clone --mirror git@gitlab.example.com:ops/ops-repo.git /backup/ops-repo.git

# 定期更新备份(cron 任务)
cat > /usr/local/bin/git-backup.sh <<'EOF'
#!/bin/bash
BACKUP_DIR="/backup/ops-repo.git"
LOG_FILE="/var/log/git-backup.log"

cd"$BACKUP_DIR" && git remote update --prune
if [ $? -eq 0 ]; then
echo"$(date '+%Y-%m-%d %H:%M:%S') - 备份成功" >> "$LOG_FILE"
else
echo"$(date '+%Y-%m-%d %H:%M:%S') - 备份失败" >> "$LOG_FILE"
fi
EOF

chmod +x /usr/local/bin/git-backup.sh

# 添加 cron(每天凌晨 2 点)
echo"0 2 * * * /usr/local/bin/git-backup.sh" | crontab -

恢复操作:

# 从备份恢复到新 Git 服务器
git clone --mirror /backup/ops-repo.git /tmp/restore-repo.git
cd /tmp/restore-repo.git
git push --mirror git@new-gitlab.example.com:ops/ops-repo.git

导出特定版本:

# 导出 v1.2.3 标签内容
git archive --format=tar.gz --prefix=ops-repo-v1.2.3/ v1.2.3 \
  -o /backup/ops-repo-v1.2.3.tar.gz

Step 10: 审计与合规

启用提交签名(GPG):

# 生成 GPG 密钥
gpg --full-generate-key  # 选择 RSA 4096

# 查看密钥 ID
gpg --list-secret-keys --keyid-format LONG

# 配置 Git 使用 GPG
git config --global user.signingkey
git config --global commit.gpgsign true
git config --global tag.gpgsign true

# 导出公钥到 GitLab
gpg --armor --export 

签名提交示例:

git commit -S -m "feat: 添加 Redis 高可用配置"

验证签名:

git log --show-signature
git verify-commit HEAD

审计日志查询:

# 查看所有操作者
git log --pretty=format:"%h - %an : %s" --all

# 查看特定文件修改历史
git log --follow --all -- ansible/playbooks/nginx-config.yml

# 导出审计报告(最近 30 天)
git log --since="30 days ago" --pretty=format:"%ai | %an | %s" \
  > /tmp/git-audit-$(date +%F).log

监控与告警(立即可用)

GitLab CI/CD 集成监控

Pipeline 配置(.gitlab-ci.yml):

stages:
-validate
-deploy

validate_ansible:
stage:validate
image:alpine:latest
before_script:
-apkadd--no-cacheansibleyamllint
script:
-yamllintansible/
-ansible-playbook--syntax-checkansible/playbooks/*.yml
only:
-merge_requests

deploy_production:
stage:deploy
script:
-ansible-playbook-iansible/inventories/productionansible/playbooks/deploy.yml
only:
-prod
when:manual

Git 操作监控脚本

#!/bin/bash
# 监控仓库推送频率(检测异常大量提交)

REPO_PATH="/var/opt/gitlab/git-data/repositories/ops/ops-repo.git"
THRESHOLD=50  # 单小时提交数阈值

COMMITS=$(git --git-dir="$REPO_PATH" rev-list --since="1 hour ago" --count --all)

if [ "$COMMITS" -gt "$THRESHOLD" ]; then
echo"告警:最近 1 小时提交数 $COMMITS 超过阈值 $THRESHOLD"
# 触发告警(示例:发送邮件)
echo"异常提交检测" | mail -s "Git 告警" ops@example.com
fi

性能与容量(可复制)

仓库体积优化

诊断大文件:

# 查找历史中的大对象
git rev-list --objects --all | \
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \
  awk '/^blob/ {print substr($0,6)}' | sort -k2nr | head -20

清理历史大文件:

# 使用 git-filter-repo(比 filter-branch 更快)
pip3 install git-filter-repo

# 删除所有 *.iso 文件
git filter-repo --path-glob '*.iso' --invert-paths

# 强制推送(需通知团队)
git push origin --force --all
git push origin --force --tags

垃圾回收:

# 压缩对象数据库
git gc --aggressive --prune=now

# 查看优化效果
du -sh .git

克隆加速

浅克隆(仅最新版本):

# 仅克隆最新 1 次提交(适合 CI/CD)
git clone --depth 1 git@gitlab.example.com:ops/ops-repo.git

# 后续获取完整历史
git fetch --unshallow

部分克隆(Git 2.22+):

# 仅克隆必要对象
git clone --filter=blob:none git@gitlab.example.com:ops/ops-repo.git

安全与合规(最小必需)

访问控制

SSH 密钥管理:

# 限制密钥用途(~/.ssh/authorized_keys)
command="/usr/bin/git-shell -c \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAA...

仓库权限审计:

# GitLab API 查询项目成员
curl --header "PRIVATE-TOKEN: " \
"https://gitlab.example.com/api/v4/projects/123/members"

合规检查清单

  • • [ ] 所有生产变更需通过 MR 审批(至少 1 人)
  • • [ ] 敏感分支启用保护(prod/staging)
  • • [ ] 提交启用 GPG 签名(可选但推荐)
  • • [ ] 敏感数据使用 git-crypt 或 Ansible Vault 加密
  • • [ ] 每日备份裸仓库到离线存储
  • • [ ] 定期审计提交日志(每月导出)

常见故障与排错

症状
诊断命令
可能根因
快速修复
永久修复
推送被拒绝(non-fast-forward)
git log --graph --all
远程有新提交
git pull --rebase && git push
养成推送前先拉取的习惯
合并冲突
git status
多人修改同一文件
手动编辑冲突文件,git add 后提交
细化分支粒度,减少交叉修改
误提交敏感文件
git log --all -- *.key
未配置 .gitignore
git filter-repo --path *.key --invert-paths
配置完善的 .gitignore
仓库体积过大
git count-objects -vH
历史中存在大二进制文件
git gc --aggressive
使用 LFS 管理大文件
克隆速度慢
time git clone
仓库历史过长
git clone --depth 1
定期归档旧历史
分支混乱
git branch -a
未及时删除无用分支
git remote prune origin
制定分支管理规范

变更与回滚剧本

变更流程

  1. 1. 开发环境验证(main 分支):功能测试 + Ansible 语法检查
  2. 2.  预发布环境(staging 分支):全量测试 24 小时
  3. 3. 生产发布(prod 分支):
  • • 维护窗口:周二/周四 22:00-23:00
  • • 灰度策略:单节点 → 10% → 50% → 100%
  • • 健康检查:每阶段运行 ansible -m ping all

回滚操作

场景 1:最近一次提交有问题

git revert HEAD
git push origin prod

场景 2:回退到指定版本

# 查看标签
git tag -l

# 回退到 v1.2.2
git checkout prod
git reset --hard v1.2.2
git push --force origin prod  # 需提前通知团队

场景 3:恢复误删分支

# 查看 reflog(最近 90 天内有效)
git reflog

# 恢复分支
git checkout -b recovered-branch

最佳实践(10 条要点)

  1. 1. 提交粒度:单次提交仅做一件事,消息遵循约定式提交(Conventional Commits)
  2. 2. 分支命名feature/bugfix/hotfix/ 前缀 + 简短描述
  3. 3. 频繁推送:每日至少推送一次,避免本地堆积大量提交
  4. 4. 保护主分支:生产分支禁止直接推送,必须通过 MR
  5. 5. 标签管理:每次生产发布打标签(语义化版本:v1.2.3)
  6. 6. 钩子自动化:pre-commit 检查语法,post-receive 触发部署
  7. 7. 敏感数据隔离:密钥存储在 Vault/KMS,仓库仅保留加密密文
  8. 8. 定期清理:每季度归档无用分支,删除历史大文件
  9. 9. 备份策略:每日增量备份,每周全量备份到异地
  10. 10. 团队培训:新成员必须完成 Git 基础培训 + 实操演练

附录(样例资产)

A. 完整 .gitignore(运维场景)

# 认证凭证
*.key
*.pem
*.p12
*.pfx
*.jks
*.crt
*.cer
id_rsa*
id_ecdsa*
id_ed25519*
.kube/config
.aws/credentials
.azure/credentials
gcloud/

# 密码与令牌
*.env
.env.*
secrets.yml
credentials.yml
vault-password*
*_token
*_secret
*.password

# 基础设施状态
*.tfstate
*.tfstate.*
.terraform/
.terragrunt-cache/

# 配置管理
ansible/retry/
*.retry

# 日志与临时文件
*.log
*.tmp
*.bak
*.swp
*.swo
*~
.DS_Store

# IDE
.vscode/
.idea/
*.iml

B. Git Hooks 模板集合

pre-commit(多项检查):

#!/bin/bash

echo"运行 pre-commit 检查..."

# 1. 检查敏感文件
if git diff --cached --name-only | grep -qE '\.(key|pem|env)$'then
echo"❌ 错误:检测到敏感文件"
exit 1
fi

# 2. YAML 语法检查
for file in $(git diff --cached --name-only | grep '\.ya\?ml$'); do
  yamllint "$file" || exit 1
done

# 3. Shell 脚本语法检查
for file in $(git diff --cached --name-only | grep '\.sh$'); do
  bash -n "$file" || exit 1
done

# 4. Terraform 格式检查
if git diff --cached --name-only | grep -q '\.tf$'then
  terraform fmt -check || exit 1
fi

echo"✅ 所有检查通过"
exit 0

C. GitLab CI/CD 完整示例

# .gitlab-ci.yml
variables:
ANSIBLE_FORCE_COLOR:"true"

stages:
-validate
-test
-deploy

# 验证阶段
validate:yaml:
stage:validate
image:alpine:latest
before_script:
-apkadd--no-cacheyamllint
script:
-yamllint-c.yamllintansible/
only:
-merge_requests
-main

validate:ansible:
stage:validate
image:cytopia/ansible:latest
script:
-ansible-playbook--syntax-checkansible/playbooks/*.yml
only:
-merge_requests
-main

validate:terraform:
stage:validate
image:hashicorp/terraform:latest
script:
-cdterraform/
-terraforminit-backend=false
-terraformvalidate
only:
-merge_requests
-main

# 测试阶段
test:dry-run:
stage:test
image:cytopia/ansible:latest
script:
-ansible-playbook-iansible/inventories/stagingansible/playbooks/deploy.yml--check
only:
-merge_requests

# 部署阶段
deploy:staging:
stage:deploy
image:cytopia/ansible:latest
script:
-ansible-playbook-iansible/inventories/stagingansible/playbooks/deploy.yml
only:
-staging
environment:
name:staging
url:https://staging.example.com

deploy:production:
stage:deploy
image:cytopia/ansible:latest
script:
-ansible-playbook-iansible/inventories/productionansible/playbooks/deploy.yml
only:
-prod
when:manual
environment:
name:production
url:https://example.com

D. Ansible + Git 自动化部署

# ansible/playbooks/git-deploy.yml
-name:Git仓库部署配置
hosts:all
become:yes
vars:
repo_url:"git@gitlab.example.com:ops/ops-repo.git"
deploy_path:"/opt/ops-config"
branch:"prod"

tasks:
-name:安装Git
package:
name:git
state:present

-name:克隆/更新仓库
git:
repo:"{{ repo_url }}"
dest:"{{ deploy_path }}"
version:"{{ branch }}"
force:yes
accept_hostkey:yes
register:git_result

-name:显示更新信息
debug:
msg:"更新到 commit: {{ git_result.after }}"

-name:应用配置
command:"{{ deploy_path }}/scripts/apply-config.sh"
when:git_result.changed

-name:重启相关服务
systemd:
name:nginx
state:restarted
when:git_result.changed

E. 自动化备份脚本(完整版)

#!/bin/bash
# /usr/local/bin/git-backup-full.sh

set -euo pipefail

# 配置
REPOS=(
"git@gitlab.example.com:ops/ops-repo.git"
"git@gitlab.example.com:ops/ansible-playbooks.git"
"git@gitlab.example.com:ops/terraform-infra.git"
)
BACKUP_ROOT="/backup/git"
RETENTION_DAYS=90
LOG_FILE="/var/log/git-backup.log"

# 日志函数
log() {
echo"[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

# 创建备份目录
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_DIR="$BACKUP_ROOT/$BACKUP_DATE"
mkdir -p "$BACKUP_DIR"

# 备份每个仓库
for repo in"${REPOS[@]}"do
  repo_name=$(basename"$repo" .git)
log "开始备份: $repo_name"

if git clone --mirror "$repo""$BACKUP_DIR/$repo_name.git" 2>&1 | tee -a "$LOG_FILE"then
log"✅ $repo_name 备份成功"

# 压缩备份
    tar czf "$BACKUP_DIR/$repo_name.tar.gz" -C "$BACKUP_DIR""$repo_name.git"
rm -rf "$BACKUP_DIR/$repo_name.git"
else
log"❌ $repo_name 备份失败"
fi
done

# 清理旧备份
find "$BACKUP_ROOT" -type d -mtime +$RETENTION_DAYS -execrm -rf {} + 2>/dev/null || true

log"备份完成,目录:$BACKUP_DIR"

测试日期:2025-10,基于 Git 2.43 / GitLab CE 16.5 / RHEL 9.3 / Ubuntu 22.04 LTS验证环境:GitLab CE 自建实例、GitHub Enterprise、Gitea 1.21

文末福利


网络监控是保障网络系统和数据安全的重要手段,能够帮助运维人员及时发现并应对各种问题,及时发现并解决,从而确保网络的顺畅运行。

谢谢一路支持,给大家分享6款开源免费的网络监控工具,并准备了对应的资料文档,建议运维工程师收藏(文末一键领取)。

图片
备注:【监控合集】

图片

100%免费领取


一、zabbix

图片
图片

二、Prometheus


图片

内容较多,6款常用网络监控工具(zabbix、Prometheus、Cacti、Grafana、OpenNMS、Nagios不再一一介绍, 需要的朋友扫码备注【监控合集】,即可100%免费领取。

图片

 以上所有资料获取请扫码

备注:【监控合集】

图片

100%免费领取

(后台不再回复,扫码一键领取)


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/188642