web-map/自动同步仓库.ps1

153 lines
5.3 KiB
PowerShell
Raw Normal View History

# Git多仓库同步脚本 (PowerShell)
# 用于同步镜像仓库到你的个人仓库
param(
[switch]$UseRebase = $false,
[switch]$DryRun = $false
)
function Write-ColorOutput {
param(
[string]$Message,
[string]$Color = "White"
)
Write-Host $Message -ForegroundColor $Color
}
function Check-GitStatus {
$status = git status --porcelain
if ($status) {
Write-ColorOutput "警告: 工作目录不干净,请先提交或储藏你的更改!" "Yellow"
git status
return $false
}
return $true
}
function Sync-Repositories {
Write-ColorOutput "开始同步镜像仓库..." "Cyan"
# 检查工作目录状态
if (-not (Check-GitStatus)) {
if (-not $DryRun) {
return
}
}
# 获取镜像仓库最新代码
Write-ColorOutput "正在获取upstream最新代码..." "Green"
if (-not $DryRun) {
git fetch upstream
if ($LASTEXITCODE -ne 0) {
Write-ColorOutput "获取upstream代码失败" "Red"
return
}
} else {
Write-ColorOutput "[预览模式] git fetch upstream" "Gray"
}
# 检查是否有新的提交
$upstreamCommits = git log HEAD..upstream/master --oneline
if ($upstreamCommits) {
Write-ColorOutput "发现镜像仓库有新的提交:" "Yellow"
Write-ColorOutput $upstreamCommits "Gray"
if ($UseRebase) {
Write-ColorOutput "正在使用rebase合并代码..." "Green"
if (-not $DryRun) {
git rebase upstream/master
if ($LASTEXITCODE -ne 0) {
Write-ColorOutput "Rebase失败请手动解决冲突后再继续。" "Red"
Write-ColorOutput "解决冲突后请运行: git rebase --continue" "Yellow"
return
}
} else {
Write-ColorOutput "[预览模式] git rebase upstream/master" "Gray"
}
} else {
Write-ColorOutput "正在使用merge合并代码..." "Green"
if (-not $DryRun) {
git merge upstream/master
if ($LASTEXITCODE -ne 0) {
Write-ColorOutput "Merge失败请手动解决冲突后再继续。" "Red"
Write-ColorOutput "解决冲突后请运行: git commit" "Yellow"
return
}
} else {
Write-ColorOutput "[预览模式] git merge upstream/master" "Gray"
}
}
Write-ColorOutput "同步完成!" "Green"
Write-ColorOutput ""
Write-ColorOutput "下一步操作提示:" "Cyan"
Write-ColorOutput " 请手动推送到你的仓库: git push origin master" "White"
if ($UseRebase) {
Write-ColorOutput " (如果使用了rebase可能需要: git push origin master --force-with-lease)" "Yellow"
}
} else {
Write-ColorOutput "镜像仓库没有新的提交,检查本地是否有未推送的修改..." "Blue"
# 检查是否有本地修改需要推送
$localCommits = git log origin/master..HEAD --oneline
if ($localCommits) {
Write-ColorOutput "发现本地有未推送的修改:" "Yellow"
Write-ColorOutput $localCommits "Gray"
Write-ColorOutput ""
Write-ColorOutput "下一步操作提示:" "Cyan"
Write-ColorOutput " 请手动推送到你的仓库: git push origin master" "White"
} else {
Write-ColorOutput "没有需要同步的内容。" "Blue"
}
}
}
function Show-Help {
Write-ColorOutput "Git多仓库同步脚本" "Cyan"
Write-ColorOutput "用法: .\sync-repos.ps1 [选项]" "White"
Write-ColorOutput ""
Write-ColorOutput "选项:" "Yellow"
Write-ColorOutput " -UseRebase 使用rebase代替merge进行合并" "White"
Write-ColorOutput " -DryRun 预览模式不执行实际的git命令" "White"
Write-ColorOutput " -Help 显示此帮助信息" "White"
Write-ColorOutput ""
Write-ColorOutput "示例:" "Yellow"
Write-ColorOutput " .\sync-repos.ps1 # 使用merge同步" "White"
Write-ColorOutput " .\sync-repos.ps1 -UseRebase # 使用rebase同步" "White"
Write-ColorOutput " .\sync-repos.ps1 -DryRun # 预览模式" "White"
Write-ColorOutput ""
Write-ColorOutput "注意: 脚本不会自动推送到你的仓库,需要手动执行推送命令。" "Yellow"
}
# 主程序
if ($args -contains "-Help" -or $args -contains "--help" -or $args -contains "-h") {
Show-Help
return
}
Write-ColorOutput "Git多仓库同步工具" "Cyan"
Write-ColorOutput "===================" "Cyan"
# 显示当前配置
Write-ColorOutput "当前远程仓库配置:" "Blue"
git remote -v
Write-ColorOutput ""
if ($DryRun) {
Write-ColorOutput "预览模式 - 不会执行实际的git命令" "Yellow"
}
if ($UseRebase) {
Write-ColorOutput "使用rebase模式" "Yellow"
} else {
Write-ColorOutput "使用merge模式" "Yellow"
}
Write-ColorOutput ""
Sync-Repositories
# 等待用户按键后再关闭
Write-ColorOutput ""
Write-ColorOutput "按任意键继续..." "Green"
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")