Update 2026-03-21 08:11:45
This commit is contained in:
@@ -1,252 +1,259 @@
|
|||||||
#!/bin/env sh
|
#!/usr/bin/env bash
|
||||||
#!/system/bin/sh
|
# 适配 Android/Termux/MT 管理器环境
|
||||||
|
|
||||||
# 远程仓库地址
|
# ================= 配置区 =================
|
||||||
MY_REPO_URL="https://github.com/cluntop/tvbox.git"
|
MY_REPO_URL="https://github.com/cluntop/tvbox.git"
|
||||||
|
|
||||||
# 日志文件路径
|
|
||||||
LOG_FILE="/data/data/bin.mt.plus/home/tvbox/.github/git.log"
|
LOG_FILE="/data/data/bin.mt.plus/home/tvbox/.github/git.log"
|
||||||
|
|
||||||
# 颜色定义
|
# ================= 颜色与样式 =================
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
BLUE='\033[0;34m'
|
BLUE='\033[0;34m'
|
||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
|
PURPLE='\033[0;35m'
|
||||||
|
BOLD='\033[1m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
# 确保日志目录存在
|
# ================= 基础函数 =================
|
||||||
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null
|
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null
|
||||||
|
|
||||||
# 日志记录函数
|
|
||||||
log() {
|
log() {
|
||||||
if [ -w "$(dirname "$LOG_FILE")" ]; then
|
if [ -w "$(dirname "$LOG_FILE")" ]; then
|
||||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 提示函数
|
success_msg() { echo -e "${GREEN}✔ $1${NC}"; log "成功: $1"; }
|
||||||
success_msg() { echo -e "${GREEN}✓ $1${NC}"; log "成功: $1"; }
|
error_msg() { echo -e "${RED}✘ $1${NC}"; log "错误: $1"; }
|
||||||
error_msg() { echo -e "${RED}✗ $1${NC}"; log "错误: $1"; }
|
|
||||||
warn_msg() { echo -e "${YELLOW}⚠ $1${NC}"; log "警告: $1"; }
|
warn_msg() { echo -e "${YELLOW}⚠ $1${NC}"; log "警告: $1"; }
|
||||||
info_msg() { echo -e "${CYAN}ℹ $1${NC}"; }
|
info_msg() { echo -e "${CYAN}ℹ $1${NC}"; }
|
||||||
|
title_msg() { echo -e "\n${BOLD}${PURPLE}>>> $1 <<<${NC}\n"; }
|
||||||
|
|
||||||
# 检查网络
|
|
||||||
check_network() {
|
|
||||||
info_msg "检查网络连接..."
|
|
||||||
if ping -c 1 -W 2 github.com > /dev/null 2>&1 || ping -c 1 -W 2 baidu.com > /dev/null 2>&1; then
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
error_msg "网络连接失败"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查 Git
|
|
||||||
check_git() {
|
check_git() {
|
||||||
if ! command -v git > /dev/null 2>&1; then
|
if ! command -v git > /dev/null 2>&1; then
|
||||||
error_msg "Git 未安装"
|
error_msg "未检测到 Git,请先安装。"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 检查仓库状态
|
|
||||||
check_git_repo() {
|
check_git_repo() {
|
||||||
if [ ! -d ".git" ]; then
|
if [ ! -d ".git" ]; then
|
||||||
warn_msg "当前目录不是 Git 仓库"
|
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
# Root 权限检查
|
# ================= 核心增强功能 =================
|
||||||
if [ "$(id -u)" -ne 0 ]; then
|
|
||||||
warn_msg "尝试获取 Root 权限..."
|
|
||||||
exec sudo "$0" "$@" 2>/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 初始化
|
# 1. 增强版提交 (可视化 & 自定义)
|
||||||
check_git
|
enhanced_submit() {
|
||||||
|
title_msg "🚀 提交与推送工作流"
|
||||||
|
if ! check_git_repo; then error_msg "当前非 Git 仓库"; return 1; fi
|
||||||
|
|
||||||
# ================= 核心功能 =================
|
local changes=$(git status --porcelain)
|
||||||
|
if [ -z "$changes" ]; then
|
||||||
# 1. 初始化仓库
|
warn_msg "工作区很干净,没有需要提交的文件。"
|
||||||
init_repo() {
|
|
||||||
if [ -d ".git" ]; then
|
|
||||||
error_msg "这里已经是 Git 仓库了"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "准备在 ${YELLOW}$(pwd)${NC} 初始化..."
|
|
||||||
read -p "确认? (y/n): " confirm
|
|
||||||
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
|
||||||
git init && git checkout -b main 2>/dev/null || git branch -M main
|
|
||||||
success_msg "初始化完成"
|
|
||||||
|
|
||||||
# 初始化后自动询问是否添加远程仓库
|
|
||||||
read -p "是否立即关联远程仓库? (y/n): " add_remote
|
|
||||||
if [ "$add_remote" = "y" ] || [ "$add_remote" = "Y" ]; then
|
|
||||||
warehouse
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 2. 切换目录
|
|
||||||
change_work_dir() {
|
|
||||||
echo -e "\n${BLUE}=== 切换工作目录 ===${NC}"
|
|
||||||
echo "当前: $(pwd)"
|
|
||||||
read -p "输入新路径: " new_path
|
|
||||||
|
|
||||||
[ -z "$new_path" ] && return
|
|
||||||
|
|
||||||
if [ ! -d "$new_path" ]; then
|
|
||||||
read -p "目录不存在,创建? (y/n): " create
|
|
||||||
if [ "$create" = "y" ] || [ "$create" = "Y" ]; then
|
|
||||||
mkdir -p "$new_path" || { error_msg "创建失败"; return; }
|
|
||||||
else
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
cd "$new_path" || return
|
|
||||||
success_msg "已切换至: $(pwd)"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 3. 设置固定远程仓库
|
|
||||||
warehouse() {
|
|
||||||
info_msg "设置远程仓库..."
|
|
||||||
if ! check_git_repo; then return 1; fi
|
|
||||||
|
|
||||||
target_url="$MY_REPO_URL"
|
|
||||||
|
|
||||||
# 检查当前配置
|
|
||||||
if git remote get-url origin > /dev/null 2>&1; then
|
|
||||||
current_url=$(git remote get-url origin)
|
|
||||||
if [ "$current_url" == "$target_url" ]; then
|
|
||||||
success_msg "远程仓库已正确配置: $target_url"
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
warn_msg "当前远程仓库: $current_url"
|
|
||||||
warn_msg "目标固定仓库: $target_url"
|
|
||||||
read -p "是否覆盖为固定仓库地址? (y/n): " confirm
|
|
||||||
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
git remote remove origin
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if git remote add origin "$target_url" 2>&1; then
|
|
||||||
success_msg "已绑定远程仓库: $target_url"
|
|
||||||
else
|
|
||||||
# 如果 add 失败,尝试 set-url
|
|
||||||
git remote set-url origin "$target_url" && success_msg "已更新远程仓库: $target_url"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 4. 拉取
|
|
||||||
branch() {
|
|
||||||
if ! check_git_repo; then return 1; fi
|
|
||||||
curr=$(git branch --show-current)
|
|
||||||
[ -z "$curr" ] && curr="main"
|
|
||||||
|
|
||||||
info_msg "拉取 origin/$curr ..."
|
|
||||||
if git pull origin "$curr" 2>&1; then
|
|
||||||
success_msg "拉取成功"
|
|
||||||
else
|
|
||||||
error_msg "拉取失败"
|
|
||||||
# 尝试自动关联
|
|
||||||
git branch --set-upstream-to=origin/"$curr" "$curr" 2>/dev/null
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 5. 提交
|
|
||||||
# 5. 提交
|
|
||||||
submit() {
|
|
||||||
if ! check_git_repo; then return 1; fi
|
|
||||||
|
|
||||||
if [ -z "$(git status --porcelain)" ]; then
|
|
||||||
warn_msg "没有文件变动"
|
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
curr=$(git branch --show-current)
|
echo -e "${YELLOW}待提交的文件变更:${NC}"
|
||||||
[ -z "$curr" ] && curr="main"
|
git status --short
|
||||||
|
echo ""
|
||||||
|
|
||||||
info_msg "1. 添加文件..."
|
# 自定义提交信息
|
||||||
|
read -p "📝 输入提交信息 (直接回车默认: Update [当前时间]): " msg
|
||||||
|
[ -z "$msg" ] && msg="Update $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
|
||||||
|
info_msg "1/3 执行 git add . ..."
|
||||||
git add .
|
git add .
|
||||||
|
|
||||||
info_msg "2. 提交推送..."
|
info_msg "2/3 执行 git commit ..."
|
||||||
msg="Update Up"
|
|
||||||
git commit -m "$msg"
|
git commit -m "$msg"
|
||||||
|
|
||||||
|
local curr=$(git branch --show-current)
|
||||||
|
[ -z "$curr" ] && curr="main"
|
||||||
|
|
||||||
|
info_msg "3/3 推送至 origin/$curr ..."
|
||||||
if git push origin "$curr"; then
|
if git push origin "$curr"; then
|
||||||
success_msg "推送成功"
|
success_msg "推送成功!"
|
||||||
else
|
else
|
||||||
warn_msg "推送失败,尝试强制关联..."
|
warn_msg "推送失败,可能需要先拉取或强制关联..."
|
||||||
git push --set-upstream origin "$curr"
|
read -p "是否尝试强制建立上游分支并推送? (y/n): " force_push
|
||||||
|
if [[ "$force_push" =~ ^[Yy]$ ]]; then
|
||||||
|
git push --set-upstream origin "$curr" && success_msg "强制推送成功" || error_msg "推送依然失败,请检查网络或冲突"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 2. 增强版拉取 (安全检测 & 状态展示)
|
||||||
|
enhanced_pull() {
|
||||||
|
title_msg "📥 拉取最新更新"
|
||||||
|
if ! check_git_repo; then error_msg "当前非 Git 仓库"; return 1; fi
|
||||||
|
|
||||||
# 6. 状态
|
local curr=$(git branch --show-current)
|
||||||
state() {
|
[ -z "$curr" ] && curr="main"
|
||||||
[ -d ".git" ] && git status
|
|
||||||
|
info_msg "1/2 正在获取远程状态 (git fetch)..."
|
||||||
|
git fetch origin 2>/dev/null
|
||||||
|
|
||||||
|
# 检查是否有冲突风险
|
||||||
|
local local_changes=$(git status --porcelain)
|
||||||
|
if [ -n "$local_changes" ]; then
|
||||||
|
warn_msg "检测到本地有未提交的更改,直接拉取可能导致冲突!"
|
||||||
|
read -p "是否暂存(stash)本地更改后再拉取? (y/n): " stash_choice
|
||||||
|
if [[ "$stash_choice" =~ ^[Yy]$ ]]; then
|
||||||
|
git stash
|
||||||
|
info_msg "本地更改已暂存。"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
info_msg "2/2 正在拉取代码合并 (git pull origin $curr)..."
|
||||||
|
if git pull origin "$curr" 2>&1; then
|
||||||
|
success_msg "拉取成功,已同步到最新状态。"
|
||||||
|
else
|
||||||
|
error_msg "拉取失败,存在冲突或网络问题。"
|
||||||
|
# 如果刚才暂存了,提示用户恢复
|
||||||
|
if [[ "$stash_choice" =~ ^[Yy]$ ]]; then
|
||||||
|
warn_msg "请注意:您的本地更改在 stash 中,请手动解决冲突后运行 'git stash pop'"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# 7. 深度清理 (双重指令)
|
# 3. 分支管理 (新增功能)
|
||||||
garbage() {
|
manage_branches() {
|
||||||
if ! check_git_repo; then return 1; fi
|
title_msg "🌿 分支管理"
|
||||||
|
if ! check_git_repo; then error_msg "当前非 Git 仓库"; return 1; fi
|
||||||
|
|
||||||
warn_msg "正在进行深度清理,请稍候..."
|
echo -e "${CYAN}当前本地分支:${NC}"
|
||||||
|
git branch -a
|
||||||
|
echo ""
|
||||||
|
echo "1) 创建并切换新分支"
|
||||||
|
echo "2) 切换到已有分支"
|
||||||
|
echo "3) 返回"
|
||||||
|
read -p "请选择: " b_choice
|
||||||
|
case $b_choice in
|
||||||
|
1)
|
||||||
|
read -p "输入新分支名称: " b_name
|
||||||
|
[ -n "$b_name" ] && git checkout -b "$b_name" && success_msg "已切换到新分支: $b_name"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
read -p "输入目标分支名称: " b_name
|
||||||
|
[ -n "$b_name" ] && git checkout "$b_name" && success_msg "已切换到分支: $b_name"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
# 步骤1: 清理过期引用记录
|
# 4. 可视化日志 (新增功能)
|
||||||
echo "1/2: 清理 reflog..."
|
view_logs() {
|
||||||
|
title_msg "📜 Git 提交日志"
|
||||||
|
if ! check_git_repo; then error_msg "当前非 Git 仓库"; return 1; fi
|
||||||
|
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit -n 10
|
||||||
|
echo -e "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 5. 原有功能优化 (绑定仓库、初始化、切换目录、清理)
|
||||||
|
bind_remote() {
|
||||||
|
title_msg "🔗 绑定远程仓库"
|
||||||
|
check_git_repo || return 1
|
||||||
|
local current_url=$(git remote get-url origin 2>/dev/null)
|
||||||
|
|
||||||
|
echo -e "当前仓库地址: ${YELLOW}${current_url:-"未设置"}${NC}"
|
||||||
|
echo -e "目标固定地址: ${GREEN}$MY_REPO_URL${NC}"
|
||||||
|
|
||||||
|
read -p "确定要将 origin 设置为目标固定地址吗? (y/n): " confirm
|
||||||
|
if [[ "$confirm" =~ ^[Yy]$ ]]; then
|
||||||
|
git remote remove origin 2>/dev/null
|
||||||
|
git remote add origin "$MY_REPO_URL" && success_msg "已绑定远程仓库" || error_msg "绑定失败"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
init_repo() {
|
||||||
|
title_msg "📦 初始化新仓库"
|
||||||
|
if [ -d ".git" ]; then error_msg "当前目录已是 Git 仓库"; return 1; fi
|
||||||
|
git init && git checkout -b main 2>/dev/null || git branch -M main
|
||||||
|
success_msg "初始化完成,当前分支: main"
|
||||||
|
}
|
||||||
|
|
||||||
|
change_dir() {
|
||||||
|
title_msg "📁 切换工作目录"
|
||||||
|
echo -e "当前路径: ${YELLOW}$(pwd)${NC}"
|
||||||
|
read -p "输入新路径 (支持相对/绝对路径): " new_path
|
||||||
|
if [ -n "$new_path" ]; then
|
||||||
|
mkdir -p "$new_path" 2>/dev/null
|
||||||
|
cd "$new_path" && success_msg "已切换至: $(pwd)" || error_msg "路径切换失败"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
deep_clean() {
|
||||||
|
title_msg "🧹 深度清理与空间回收"
|
||||||
|
check_git_repo || return 1
|
||||||
|
info_msg "清理 reflog 并压缩对象..."
|
||||||
git reflog expire --expire=now --all 2>/dev/null
|
git reflog expire --expire=now --all 2>/dev/null
|
||||||
|
git gc --prune=now --aggressive 2>/dev/null
|
||||||
# 步骤2: 强力回收空间
|
success_msg "深度清理完成!当前 .git 体积: $(du -sh .git 2>/dev/null | cut -f1)"
|
||||||
echo "2/2: 压缩并修剪对象..."
|
|
||||||
if git gc --prune=now --aggressive 2>&1; then
|
|
||||||
success_msg "深度清理完成!"
|
|
||||||
# 显示大小
|
|
||||||
size=$(du -sh .git 2>/dev/null | cut -f1)
|
|
||||||
info_msg "当前仓库体积: $size"
|
|
||||||
else
|
|
||||||
error_msg "清理过程中出现问题"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 菜单
|
# ================= 可视化仪表盘 (主菜单) =================
|
||||||
show_menu() {
|
show_dashboard() {
|
||||||
clear 2>/dev/null || printf '\033[2J\033[H'
|
clear 2>/dev/null || printf '\033[2J\033[H'
|
||||||
echo -e "${CYAN}=== Git 管理工具 ===${NC}"
|
echo -e "${BOLD}${BLUE}══════════════════════════════════════════════${NC}"
|
||||||
echo -e "位置: ${YELLOW}$(pwd)${NC}"
|
echo -e "${BOLD}${CYAN} 🛠️ Git Master 可视化终端工具 ${NC}"
|
||||||
echo -e "固定仓库: ${GREEN}$MY_REPO_URL${NC}"
|
echo -e "${BOLD}${BLUE}══════════════════════════════════════════════${NC}"
|
||||||
echo ""
|
|
||||||
echo " 1) 提交 (二连)"
|
echo -e " 📍 ${BOLD}当前路径:${NC} ${YELLOW}$(pwd)${NC}"
|
||||||
echo " 2) 拉取 (Pull)"
|
|
||||||
echo " 3) 绑定远程仓库 (Fix Remote)"
|
if check_git_repo; then
|
||||||
echo " 4) 查看状态"
|
local b_name=$(git branch --show-current 2>/dev/null)
|
||||||
echo " 5) 深度清理 (Reflog + GC)"
|
local changes=$(git status --porcelain 2>/dev/null | wc -l)
|
||||||
echo " 6) 初始化新仓库 (Init)"
|
local remote=$(git remote get-url origin 2>/dev/null || echo "未绑定")
|
||||||
echo " 7) 切换工作目录 (Cd)"
|
echo -e " 🌿 ${BOLD}当前分支:${NC} ${GREEN}${b_name:-"未命名"}${NC}"
|
||||||
echo " 0) 退出"
|
echo -e " 🔗 ${BOLD}远程仓库:${NC} ${CYAN}${remote}${NC}"
|
||||||
echo ""
|
if [ "$changes" -gt 0 ]; then
|
||||||
|
echo -e " 📝 ${BOLD}文件状态:${NC} ${RED}有 $changes 个文件未提交${NC}"
|
||||||
|
else
|
||||||
|
echo -e " 📝 ${BOLD}文件状态:${NC} ${GREEN}工作区干净${NC}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e " ⚠️ ${BOLD}仓库状态:${NC} ${RED}当前目录不是 Git 仓库${NC}"
|
||||||
|
fi
|
||||||
|
echo -e "${BOLD}${BLUE}──────────────────────────────────────────────${NC}"
|
||||||
|
|
||||||
|
echo -e " ${GREEN}[1] 🚀 提交与推送 (Commit & Push)${NC}"
|
||||||
|
echo -e " ${CYAN}[2] 📥 拉取与合并 (Fetch & Pull)${NC}"
|
||||||
|
echo -e " ${YELLOW}[3] 📜 查看日志 (Log Graph)${NC}"
|
||||||
|
echo -e " ${PURPLE}[4] 🌿 分支管理 (Branch Mgt)${NC}"
|
||||||
|
echo -e " ${BLUE}[5] 🔗 绑定固定仓库 (Bind Remote)${NC}"
|
||||||
|
echo -e " ${CYAN}[6] 📦 初始化仓库 (Init)${NC}"
|
||||||
|
echo -e " ${YELLOW}[7] 📁 切换目录 (Change Dir)${NC}"
|
||||||
|
echo -e " ${RED}[8] 🧹 深度清理 (GC & Clean)${NC}"
|
||||||
|
echo -e " ${BOLD}[0] ❌ 退出 (Exit)${NC}"
|
||||||
|
echo -e "${BOLD}${BLUE}══════════════════════════════════════════════${NC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Root 权限检查
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
warn_msg "建议使用 Root 权限执行以避免权限不足..."
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_git
|
||||||
|
|
||||||
|
# 主循环
|
||||||
while true; do
|
while true; do
|
||||||
show_menu
|
show_dashboard
|
||||||
read -p "选项: " num
|
read -p "👉 请选择操作编号: " choice
|
||||||
case $num in
|
case $choice in
|
||||||
1) submit ;;
|
1) enhanced_submit ;;
|
||||||
2) branch ;;
|
2) enhanced_pull ;;
|
||||||
3) warehouse ;;
|
3) view_logs ;;
|
||||||
4) state ;;
|
4) manage_branches ;;
|
||||||
5) garbage ;;
|
5) bind_remote ;;
|
||||||
6) init_repo ;;
|
6) init_repo ;;
|
||||||
7) change_work_dir ;;
|
7) change_dir ;;
|
||||||
0) exit 0 ;;
|
8) deep_clean ;;
|
||||||
*) error_msg "无效选项" ;;
|
0) echo "再见!"; exit 0 ;;
|
||||||
|
*) error_msg "无效的选项,请重新输入" ;;
|
||||||
esac
|
esac
|
||||||
echo ""
|
echo ""
|
||||||
read -p "按回车继续..."
|
read -p "Press Enter to continue..."
|
||||||
done
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user