Files
ljwx-harbor/brew/brew-doctor-fix.sh
bruno 435834dc79 feat: Harbor 版本化配置
- 添加 Harbor 快速恢复脚本 (harbor-quick-restore.sh)
- 添加完整恢复指南 (HARBOR-RESTORE-GUIDE.md)
- 添加版本信息文件 (VERSION.md)
- 更新 .gitignore 排除敏感数据
- 配置 harbor git remote
- 修复 Cloudflare Tunnel 配置

系统重装后可通过以下命令快速恢复:
git clone http://192.168.1.83:33000/gao/ljwx-harbor.git
cd ljwx-harbor
./harbor-quick-restore.sh
2026-02-27 08:12:30 +08:00

236 lines
6.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# ========================================
# Homebrew 自动修复工具
# 功能:自动诊断并修复常见的 Homebrew 问题
# ========================================
# 颜色输出
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${GREEN}✓${NC} $1"; }
log_warn() { echo -e "${YELLOW}⚠${NC} $1"; }
log_error() { echo -e "${RED}✗${NC} $1"; }
log_section() { echo -e "${BLUE}━━━${NC} $1"; }
# 检测并移除问题 tap
fix_broken_taps() {
log_section "检查并修复问题 tap"
local broken_taps=()
# 运行 brew update 并捕获错误
local update_output=$(brew update --verbose 2>&1 || true)
# 查找 "does not exist" 错误
while IFS= read -r line; do
if [[ "$line" =~ "does not exist" ]]; then
# 提取 tap 名称
local tap=$(echo "$line" | grep -oE '[a-z0-9_-]+/[a-z0-9_-]+' | head -1)
if [ -n "$tap" ]; then
broken_taps+=("$tap")
fi
fi
done <<< "$update_output"
# 移除问题 tap
if [ ${#broken_taps[@]} -gt 0 ]; then
log_warn "发现 ${#broken_taps[@]} 个问题 tap"
for tap in "${broken_taps[@]}"; do
echo " 移除: $tap"
brew untap "$tap" 2>/dev/null || true
done
log_info "问题 tap 已清理"
else
log_info "所有 tap 正常"
fi
}
# 移除 deprecated 的官方 tap
fix_deprecated_taps() {
log_section "移除 deprecated 的官方 tap"
local deprecated_taps=(
"homebrew/bundle"
"homebrew/services"
"homebrew/cask-versions"
)
local removed=0
for tap in "${deprecated_taps[@]}"; do
if brew tap | grep -q "^${tap}$"; then
echo " 移除: $tap (已集成到核心)"
brew untap "$tap" 2>/dev/null || true
removed=$((removed + 1))
fi
done
if [ $removed -gt 0 ]; then
log_info "移除了 $removed 个 deprecated tap"
else
log_info "无需移除 deprecated tap"
fi
}
# 修复未链接的包
fix_unlinked_kegs() {
log_section "修复未链接的包"
# 获取未链接的包列表
local unlinked=$(brew doctor 2>&1 | grep -A 20 "unlinked kegs" | grep "^ " | tr -d ' ' || true)
if [ -n "$unlinked" ]; then
log_warn "发现未链接的包"
while IFS= read -r keg; do
if [ -n "$keg" ]; then
echo " 链接: $keg"
brew link --overwrite "$keg" 2>/dev/null || brew link "$keg" 2>/dev/null || log_warn " 无法链接 $keg"
fi
done <<< "$unlinked"
log_info "包链接修复完成"
else
log_info "所有包已正确链接"
fi
}
# 清理 deprecated 的包(可选)
list_deprecated_packages() {
log_section "列出 deprecated 的包"
local deprecated_formulae=$(brew doctor 2>&1 | grep -A 10 "deprecated.*formulae" | grep "^ " | tr -d ' ' || true)
local deprecated_casks=$(brew doctor 2>&1 | grep -A 10 "deprecated.*casks" | grep "^ " | tr -d ' ' || true)
if [ -n "$deprecated_formulae" ]; then
log_warn "Deprecated Formulae (建议更新):"
echo "$deprecated_formulae" | sed 's/^/ /'
echo
fi
if [ -n "$deprecated_casks" ]; then
log_warn "Deprecated Casks (建议更新):"
echo "$deprecated_casks" | sed 's/^/ /'
echo
fi
if [ -z "$deprecated_formulae" ] && [ -z "$deprecated_casks" ]; then
log_info "没有 deprecated 的包"
fi
}
# 运行完整的健康检查
run_health_check() {
log_section "运行 Homebrew 健康检查"
brew doctor 2>&1 | head -50
}
# 测试更新
test_update() {
log_section "测试 brew update"
if brew update 2>&1 | grep -q "Already up-to-date"; then
log_info "brew update 正常工作"
return 0
else
log_error "brew update 仍有问题"
return 1
fi
}
# 显示帮助
show_help() {
cat << 'EOF'
Homebrew 自动修复工具
用法: brew-doctor-fix.sh [选项]
选项:
--auto 自动修复所有问题(无需确认)
--taps-only 仅修复 tap 相关问题
--link-only 仅修复未链接的包
--check-only 仅运行健康检查,不修复
--help 显示此帮助信息
示例:
# 交互式修复
./brew-doctor-fix.sh
# 自动修复所有问题
./brew-doctor-fix.sh --auto
# 仅修复 tap 问题
./brew-doctor-fix.sh --taps-only
# 仅健康检查
./brew-doctor-fix.sh --check-only
EOF
}
# 主函数
main() {
echo "╔══════════════════════════════════════════════════════════╗"
echo "║ ║"
echo "║ Homebrew 自动修复工具 ║"
echo "║ ║"
echo "╚══════════════════════════════════════════════════════════╝"
echo
local mode="${1:-interactive}"
case "$mode" in
--check-only)
run_health_check
;;
--taps-only)
fix_broken_taps
fix_deprecated_taps
test_update
;;
--link-only)
fix_unlinked_kegs
;;
--auto)
fix_broken_taps
fix_deprecated_taps
fix_unlinked_kegs
list_deprecated_packages
test_update
;;
--help|-h)
show_help
;;
interactive|*)
# 交互式模式
fix_broken_taps
echo
fix_deprecated_taps
echo
read -p "是否修复未链接的包? [y/N] " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
fix_unlinked_kegs
echo
fi
list_deprecated_packages
echo
test_update
echo
log_section "修复完成"
echo "运行 'brew doctor' 查看详细状态"
;;
esac
}
main "$@"