program/init_git.sh
2026-06-25 17:09:47 +08:00

288 lines
6.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ========================================
# 智能矿山标签监测系统 - Git初始化脚本
# ========================================
# 用于在已部署的服务器上初始化Git仓库
# 以便后续使用 upgrade.sh 进行升级
# ========================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Git仓库地址
GIT_REPO="http://10.224.35.147:3000/redline/program.git"
# 获取项目目录
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "======================================"
echo " Git仓库初始化脚本"
echo "======================================"
echo ""
echo "项目目录: $PROJECT_DIR"
echo "远程仓库: $GIT_REPO"
echo ""
# 检查是否已安装Git
if ! command -v git &> /dev/null; then
error "Git未安装"
echo "请先安装Git:"
echo " Ubuntu/Debian: sudo apt-get install -y git"
echo " CentOS/RHEL: sudo yum install -y git"
exit 1
fi
info "Git版本: $(git --version)"
echo ""
# 检查是否已经是Git仓库
if git -C "$PROJECT_DIR" rev-parse --is-inside-work-tree &> /dev/null; then
warn "当前目录已经是Git仓库"
echo ""
echo "当前状态:"
echo " 分支: $(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')"
echo " 提交: $(git -C "$PROJECT_DIR" rev-parse --short HEAD 2>/dev/null || echo 'unknown')"
echo " 远程: $(git -C "$PROJECT_DIR" remote get-url origin 2>/dev/null || echo '未配置')"
echo ""
read -p "是否重新初始化? (会保留现有数据) (y/N) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
info "操作已取消"
exit 0
fi
else
info "开始初始化Git仓库..."
fi
# 步骤1: 创建.gitignore如果不存在
info "检查.gitignore..."
if [ ! -f "${PROJECT_DIR}/.gitignore" ]; then
cat > "${PROJECT_DIR}/.gitignore" << 'GITIGNORE'
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
venv/
env/
.venv/
# 数据库
*.db-journal
*.db-wal
# 环境变量(敏感信息)
.env
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# 系统文件
.DS_Store
Thumbs.db
# 日志
*.log
logs/
# 备份
backups/
# 临时文件
.upgrade_staging/
# 编译产物
*.egg-info/
dist/
build/
*.egg
# 测试
.pytest_cache/
.coverage
htmlcov/
GITIGNORE
success "已创建.gitignore"
else
info ".gitignore已存在"
fi
echo ""
# 步骤2: 初始化Git仓库如果需要
if ! git -C "$PROJECT_DIR" rev-parse --is-inside-work-tree &> /dev/null; then
info "初始化Git仓库..."
cd "$PROJECT_DIR"
git init
success "Git仓库已初始化"
else
info "Git仓库已存在"
fi
echo ""
# 步骤3: 配置远程仓库
info "配置远程仓库..."
cd "$PROJECT_DIR"
if git remote -v | grep -q "origin" 2>/dev/null; then
local CURRENT_REMOTE=$(git remote get-url origin)
if [ "$CURRENT_REMOTE" != "$GIT_REPO" ]; then
info "更新远程仓库地址: $CURRENT_REMOTE -> $GIT_REPO"
git remote set-url origin "$GIT_REPO"
else
info "远程仓库地址已是: $GIT_REPO"
fi
else
git remote add origin "$GIT_REPO"
success "已添加远程仓库: origin"
fi
echo ""
# 步骤4: 拉取最新代码
info "从远程仓库拉取最新代码..."
# 先获取最新代码
git fetch origin 2>&1 || {
error "无法从远程仓库拉取代码"
echo "请检查:"
echo " 1. 网络连接是否正常"
echo " 2. Git仓库地址是否正确: $GIT_REPO"
echo " 3. 是否有访问权限"
exit 1
}
# 检查是否有本地修改
if ! git diff --quiet &>/dev/null || ! git status --porcelain | grep -q "^?? " &>/dev/null; then
warn "检测到本地修改或未跟踪的文件"
echo ""
echo "本地状态:"
git status --short
echo ""
# 保存本地配置
info "保存本地配置文件..."
local STAGING_DIR="${PROJECT_DIR}/.init_staging"
mkdir -p "$STAGING_DIR"
for file in "config.py" "mining_data.db" ".env"; do
if [ -f "${PROJECT_DIR}/${file}" ]; then
cp -f "${PROJECT_DIR}/${file}" "${STAGING_DIR}/${file}"
info " 已保存: $file"
fi
done
# 保存outputs目录
if [ -d "${PROJECT_DIR}/outputs" ]; then
cp -r "${PROJECT_DIR}/outputs" "${STAGING_DIR}/outputs" 2>/dev/null || true
info " 已保存: outputs/"
fi
# stash所有本地修改
git stash --include-untracked 2>/dev/null || true
fi
# 检查是否是首次拉取(空仓库)
if git log --oneline master &>/dev/null; then
# 已有本地提交,尝试合并
info "合并远程代码..."
git checkout master 2>/dev/null || git checkout -b master
# 如果是初次合并,可能需要强制重置
if ! git merge --abort 2>/dev/null; then
git reset --hard origin/master 2>/dev/null || \
git checkout master -- . 2>/dev/null || true
fi
else
# 首次拉取设置本地master到远程master
info "设置本地master分支跟踪远程..."
git checkout -B master origin/master 2>/dev/null || \
git checkout master 2>/dev/null || true
fi
# 恢复本地配置
if [ -d "$STAGING_DIR" ]; then
info "恢复本地配置文件..."
for file in "config.py" "mining_data.db" ".env"; do
if [ -f "${STAGING_DIR}/${file}" ]; then
cp -f "${STAGING_DIR}/${file}" "${PROJECT_DIR}/${file}"
info " 已恢复: $file"
fi
done
if [ -d "${STAGING_DIR}/outputs" ]; then
mkdir -p "${PROJECT_DIR}/outputs"
cp -r "${STAGING_DIR}/outputs"/* "${PROJECT_DIR}/outputs/" 2>/dev/null || true
info " 已恢复: outputs/"
fi
rm -rf "$STAGING_DIR"
fi
success "代码拉取完成"
echo ""
# 步骤5: 显示当前状态
info "当前Git状态:"
echo " 分支: $(git rev-parse --abbrev-ref HEAD)"
echo " 提交: $(git rev-parse --short HEAD)"
echo " 时间: $(git log -1 --format='%ci')"
echo " 信息: $(git log -1 --format='%s')"
echo ""
# 步骤6: 确保upgrade.sh可执行
if [ -f "${PROJECT_DIR}/upgrade.sh" ]; then
chmod +x "${PROJECT_DIR}/upgrade.sh"
success "upgrade.sh 已设置为可执行"
else
warn "upgrade.sh 不存在,请检查代码是否完整"
fi
echo ""
# 完成
echo "======================================"
echo -e "${GREEN} Git初始化完成!${NC}"
echo "======================================"
echo ""
echo "后续升级只需执行:"
echo ""
echo " bash upgrade.sh # 升级到最新版本"
echo " bash upgrade.sh status # 查看版本状态"
echo " bash upgrade.sh rollback # 回滚到上一版本"
echo ""
echo "首次升级前建议先执行备份:"
echo " bash upgrade.sh backup"
echo ""