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

160 lines
5.7 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Git多仓库同步脚本 (PowerShell)
# 用于同步镜像仓库到你的个人仓库
param(
[switch]$UseRebase = $false,
[switch]$DryRun = $false
)
# 设置控制台编码以正确显示中文
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# 设置Git配置以正确处理中文
$env:LC_ALL = "zh_CN.UTF-8"
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 | ForEach-Object { [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::Default.GetBytes($_)) }
if ($upstreamCommits) {
Write-ColorOutput "发现镜像仓库有新的提交:" "Yellow"
$upstreamCommits | ForEach-Object { Write-ColorOutput $_ "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 | ForEach-Object { [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::Default.GetBytes($_)) }
if ($localCommits) {
Write-ColorOutput "发现本地有未推送的修改:" "Yellow"
$localCommits | ForEach-Object { Write-ColorOutput $_ "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")