288 lines
6.8 KiB
Bash
288 lines
6.8 KiB
Bash
#!/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 "" |