#!/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 ""