- 添加 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
236 lines
6.2 KiB
Bash
Executable File
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 "$@"
|