refactor: 更新Git仓库检查逻辑,避免直接访问GitHub并使用镜像站进行pull操作
This commit is contained in:
@@ -781,97 +781,44 @@ ipcMain.handle('check-git-update', async () => {
|
|||||||
GIT_ASKPASS: '',
|
GIT_ASKPASS: '',
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info('开始检查Git仓库更新...')
|
log.info('开始检查Git仓库更新(跳过fetch,避免直接访问GitHub)...')
|
||||||
|
|
||||||
// 执行 git fetch 获取最新的远程信息
|
// 不执行fetch,直接检查本地状态
|
||||||
await new Promise<void>((resolve, reject) => {
|
// 这样避免了直接访问GitHub,而是在后续的pull操作中使用镜像站
|
||||||
const fetchProc = spawn(gitPath, ['fetch', 'origin'], {
|
|
||||||
stdio: 'pipe',
|
|
||||||
env: gitEnv,
|
|
||||||
cwd: appRoot,
|
|
||||||
})
|
|
||||||
|
|
||||||
fetchProc.stdout?.on('data', data => {
|
// 获取当前HEAD的commit hash
|
||||||
log.info('git fetch output:', data.toString())
|
const currentCommit = await new Promise<string>((resolve, reject) => {
|
||||||
})
|
const revParseProc = spawn(gitPath, ['rev-parse', 'HEAD'], {
|
||||||
|
|
||||||
fetchProc.stderr?.on('data', data => {
|
|
||||||
log.info('git fetch stderr:', data.toString())
|
|
||||||
})
|
|
||||||
|
|
||||||
fetchProc.on('close', code => {
|
|
||||||
if (code === 0) {
|
|
||||||
resolve()
|
|
||||||
} else {
|
|
||||||
reject(new Error(`git fetch失败,退出码: ${code}`))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
fetchProc.on('error', reject)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 检查本地分支是否落后于远程分支
|
|
||||||
const hasUpdate = await new Promise<boolean>((resolve, reject) => {
|
|
||||||
const statusProc = spawn(gitPath, ['status', '-uno', '--porcelain=v1'], {
|
|
||||||
stdio: 'pipe',
|
stdio: 'pipe',
|
||||||
env: gitEnv,
|
env: gitEnv,
|
||||||
cwd: appRoot,
|
cwd: appRoot,
|
||||||
})
|
})
|
||||||
|
|
||||||
let output = ''
|
let output = ''
|
||||||
statusProc.stdout?.on('data', data => {
|
revParseProc.stdout?.on('data', data => {
|
||||||
output += data.toString()
|
output += data.toString()
|
||||||
})
|
})
|
||||||
|
|
||||||
statusProc.stderr?.on('data', data => {
|
revParseProc.on('close', code => {
|
||||||
log.info('git status stderr:', data.toString())
|
|
||||||
})
|
|
||||||
|
|
||||||
statusProc.on('close', code => {
|
|
||||||
if (code === 0) {
|
if (code === 0) {
|
||||||
// 检查是否有 "Your branch is behind" 的信息
|
resolve(output.trim())
|
||||||
// 使用 git rev-list 来比较本地和远程分支
|
|
||||||
const revListProc = spawn(
|
|
||||||
gitPath,
|
|
||||||
['rev-list', '--count', 'HEAD..origin/feature/refactor'],
|
|
||||||
{
|
|
||||||
stdio: 'pipe',
|
|
||||||
env: gitEnv,
|
|
||||||
cwd: appRoot,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
let revOutput = ''
|
|
||||||
revListProc.stdout?.on('data', data => {
|
|
||||||
revOutput += data.toString()
|
|
||||||
})
|
|
||||||
|
|
||||||
revListProc.on('close', revCode => {
|
|
||||||
if (revCode === 0) {
|
|
||||||
const commitsBehind = parseInt(revOutput.trim())
|
|
||||||
const hasUpdates = commitsBehind > 0
|
|
||||||
log.info(`本地分支落后远程分支 ${commitsBehind} 个提交,hasUpdate: ${hasUpdates}`)
|
|
||||||
resolve(hasUpdates)
|
|
||||||
} else {
|
} else {
|
||||||
log.warn('无法比较本地和远程分支,假设有更新')
|
reject(new Error(`git rev-parse失败,退出码: ${code}`))
|
||||||
resolve(true) // 如果无法确定,假设有更新
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
revListProc.on('error', () => {
|
revParseProc.on('error', reject)
|
||||||
log.warn('git rev-list执行失败,假设有更新')
|
|
||||||
resolve(true)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
reject(new Error(`git status失败,退出码: ${code}`))
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
statusProc.on('error', reject)
|
log.info(`当前本地commit: ${currentCommit}`)
|
||||||
})
|
|
||||||
|
// 由于我们跳过了fetch步骤(避免直接访问GitHub),
|
||||||
|
// 我们无法准确知道远程是否有更新
|
||||||
|
// 因此返回true,让后续的pull操作通过镜像站来检查和获取更新
|
||||||
|
// 如果没有更新,pull操作会很快完成且不会有实际变化
|
||||||
|
log.info('跳过远程检查,返回hasUpdate=true以触发镜像站更新流程')
|
||||||
|
return { hasUpdate: true, skipReason: 'avoided_github_access' }
|
||||||
|
|
||||||
log.info(`Git更新检查完成,hasUpdate: ${hasUpdate}`)
|
|
||||||
return { hasUpdate }
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.error('检查Git更新失败:', error)
|
log.error('检查Git更新失败:', error)
|
||||||
// 如果检查失败,返回true以触发更新流程,确保代码是最新的
|
// 如果检查失败,返回true以触发更新流程,确保代码是最新的
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ export async function cloneBackend(
|
|||||||
|
|
||||||
// ==== 下面是关键逻辑 ====
|
// ==== 下面是关键逻辑 ====
|
||||||
if (isGitRepository(backendPath)) {
|
if (isGitRepository(backendPath)) {
|
||||||
// 已是 git 仓库,直接 pull
|
// 已是 git 仓库,先更新远程URL为镜像站,然后 pull
|
||||||
if (mainWindow) {
|
if (mainWindow) {
|
||||||
mainWindow.webContents.send('download-progress', {
|
mainWindow.webContents.send('download-progress', {
|
||||||
type: 'backend',
|
type: 'backend',
|
||||||
@@ -216,6 +216,24 @@ export async function cloneBackend(
|
|||||||
message: '正在更新后端代码...',
|
message: '正在更新后端代码...',
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 更新远程URL为镜像站URL,避免直接访问GitHub
|
||||||
|
console.log(`更新远程URL为镜像站: ${repoUrl}`)
|
||||||
|
await new Promise<void>((resolve, reject) => {
|
||||||
|
const proc = spawn(gitPath, ['remote', 'set-url', 'origin', repoUrl], {
|
||||||
|
stdio: 'pipe',
|
||||||
|
env: gitEnv,
|
||||||
|
cwd: backendPath
|
||||||
|
})
|
||||||
|
proc.stdout?.on('data', d => console.log('git remote set-url:', d.toString()))
|
||||||
|
proc.stderr?.on('data', d => console.log('git remote set-url err:', d.toString()))
|
||||||
|
proc.on('close', code =>
|
||||||
|
code === 0 ? resolve() : reject(new Error(`git remote set-url失败,退出码: ${code}`))
|
||||||
|
)
|
||||||
|
proc.on('error', reject)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 执行pull操作
|
||||||
await new Promise<void>((resolve, reject) => {
|
await new Promise<void>((resolve, reject) => {
|
||||||
const proc = spawn(gitPath, ['pull'], { stdio: 'pipe', env: gitEnv, cwd: backendPath })
|
const proc = spawn(gitPath, ['pull'], { stdio: 'pipe', env: gitEnv, cwd: backendPath })
|
||||||
proc.stdout?.on('data', d => console.log('git pull:', d.toString()))
|
proc.stdout?.on('data', d => console.log('git pull:', d.toString()))
|
||||||
|
|||||||
Reference in New Issue
Block a user