75 lines
2.1 KiB
Go
75 lines
2.1 KiB
Go
package util
|
||
|
||
import (
|
||
"errors"
|
||
"os"
|
||
"os/exec"
|
||
"strings"
|
||
)
|
||
|
||
// GitPull 拉取代码,丢弃本地修改
|
||
func GitPull() error {
|
||
workDir, err := os.Getwd()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 先强制重置本地更改
|
||
resetCmd := exec.Command("git", "reset", "--hard", "HEAD")
|
||
resetCmd.Dir = workDir
|
||
resetOutput, err := resetCmd.CombinedOutput()
|
||
if err != nil {
|
||
return errors.New(string(resetOutput) + err.Error())
|
||
}
|
||
|
||
// 获取当前分支名
|
||
branchCmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD")
|
||
branchCmd.Dir = workDir
|
||
branchOutput, err := branchCmd.CombinedOutput()
|
||
if err != nil {
|
||
return errors.New(string(branchOutput) + err.Error())
|
||
}
|
||
currentBranch := strings.TrimSpace(string(branchOutput)) // 移除换行符和空格
|
||
|
||
// 获取远程仓库名,通常是origin
|
||
remoteCmd := exec.Command("git", "remote")
|
||
remoteCmd.Dir = workDir
|
||
remoteOutput, err := remoteCmd.CombinedOutput()
|
||
if err != nil {
|
||
return errors.New(string(remoteOutput) + err.Error())
|
||
}
|
||
remoteName := "origin" // 默认使用origin,如果没有远程仓库则使用默认值
|
||
if len(remoteOutput) > 0 {
|
||
remoteName = strings.TrimSpace(string(remoteOutput))
|
||
}
|
||
|
||
// 先获取所有远程分支最新信息
|
||
fetchCmd := exec.Command("git", "fetch", "--all")
|
||
fetchCmd.Dir = workDir
|
||
fetchOutput, err := fetchCmd.CombinedOutput()
|
||
if err != nil {
|
||
return errors.New(string(fetchOutput) + err.Error())
|
||
}
|
||
|
||
// 构建远程分支引用
|
||
remoteBranch := remoteName + "/" + currentBranch
|
||
|
||
// 检查远程分支是否存在
|
||
checkRemoteCmd := exec.Command("git", "rev-parse", "--verify", remoteBranch)
|
||
checkRemoteCmd.Dir = workDir
|
||
if checkRemoteErr := checkRemoteCmd.Run(); checkRemoteErr != nil {
|
||
// 远程分支不存在,只进行本地重置
|
||
return nil
|
||
}
|
||
|
||
// 强制重置当前分支到远程分支(处理远程分支被force push的情况)
|
||
forceResetCmd := exec.Command("git", "reset", "--hard", remoteBranch)
|
||
forceResetCmd.Dir = workDir
|
||
forceResetOutput, err := forceResetCmd.CombinedOutput()
|
||
if err != nil {
|
||
return errors.New(string(forceResetOutput) + err.Error())
|
||
}
|
||
|
||
return nil
|
||
}
|