【问题标题】:Git commit works from command line, but fails from golang codeGit commit 从命令行工作,但从 golang 代码失败
【发布时间】:2022-12-16 04:50:16
【问题描述】:

我正在尝试执行下面提到的代码。代码创建一个分支,然后从工作树目录完成工作树和提交

代码失败并出现以下错误:

error= exit status 1

如果我直接从命令行执行提交(Cmd3),它工作正常:

sh-3.2# /usr/bin/git -C /Users/gitissue/folder1/Outer commit -m Commiting-from-folder1-Outer
On branch Outer
nothing to commit, working tree clean

脚步:

  1. 创建文件夹 /Users/gitissue
  2. cd /用户/gitissue
  3. git 初始化
  4. 触摸t.txt
  5. git 添加 .
  6. git commit -m “提交”
  7. mkdir -p /Users/gitissue/folder1
  8. 执行下面提到的go代码

    环境细节:

    • 苹果操作系统
    • git 版本 2.37.0
    • go版本go1.18.1 darwin/amd64

    代码:

    package main
    
    import (
    "fmt"
    "io"
    exec "os/exec"
    )
    
    func main() {
    
    Cmd := exec.Command("git", "-C", "/Users/gitissue", "branch", "Outer")
    fmt.Print("Cmd1= " + Cmd.String())
    err := execBashCmd(Cmd)
    if err != nil {
        fmt.Print("error1= " + err.Error())
    }
    
    
    Cmd = exec.Command("git", "-C", "/Users/gitissue/folder1", "worktree", "add", "Outer", "Outer")
    fmt.Print("Cmd2= " + Cmd.String())
    err = execBashCmd(Cmd)
    if err != nil {
        fmt.Print("error2= " + err.Error())
    }
    
    Cmd = exec.Command("git", "-C", "/Users/gitissue/folder1/Outer", "commit", "-m", "Commiting-from-folder1-Outer")
    fmt.Print("Cmd3= " + Cmd.String())
    
    err = execBashCmd(Cmd)
    if err != nil {
        fmt.Print("error3= " + err.Error())
    }
    
    }
    
    func execBashCmd(cmd *exec.Cmd) error {
    
    stderr, _ := cmd.StderrPipe()
    
    if err := cmd.Start(); err != nil {
        fmt.Print("error= " + err.Error())
    }
    
    slurp, _ := io.ReadAll(stderr)
    fmt.Printf("%s\n", slurp)
    
    if slurp != nil {
    }
    
    if err := cmd.Wait(); err != nil {
        fmt.Print("error= " + err.Error())
        return err
    }
    return nil
    

    }

    以上代码的输出:

    Cmd1= /usr/bin/git -C /Users/gitissue branch Outer
    Cmd2= /usr/bin/git -C /Users/gitissue/folder1 worktree add Outer OuterPreparing worktree (checking out 'Outer')
    
    Cmd3= /usr/bin/git -C /Users/gitissue/folder1/Outer commit -m Commiting-from-folder1-Outer
    error= exit status 1error3= exit status 1
    

【问题讨论】:

  • 从每个命令中获取 CombinedOutput,看看是什么导致它出错。
  • error= exec: already startedpanic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x1075854] cmd.Wait() 应该关闭它,对吧?我尝试添加一些 time.sleep(),但没有帮助
  • 您的代码没有并发性,所以我不明白为什么睡眠会有所帮助。该输出意味着你在某处有一个 nil 值,它应该在你的代码的原始输出中。
  • 相关的,甚至可能是复制品:How to git commit nothing without an error?
  • Cmd = exec.Command("git", "-C", "/Users/gitissue/folder1/Outer", "commit", "-m", "Commiting-from-folder1-Outer") stdoutStderr, err := Cmd.CombinedOutput()

标签: git go git-worktree


【解决方案1】:

完全没有错误。当没有要提交的内容时,Git 退出,退出代码为 1。

documentation for Go wait() 中所述,“如果命令运行,则返回的错误为 nil,复制 stdin、stdout 和 stderr 没有问题,并以零退出状态退出

如果你愿意,你可以绕过错误看它是否实现了 ExitCode() 方法,这意味着产生的错误是因为非零退出代码,然后如果退出代码是 1,忽略它(或者你可以使用任何其他类型的逻辑来处理这种情况)。

if err := cmd.Wait(); err != nil {
    if e, ok := err.(interface{ExitCode() int}); ok {
        if e.ExitCode() != 1 {
            // exit code is neither zero (as we have an error) or one
            fmt.Print("error= " + err.Error())
            return err
        }
    } else {
        return err
    }
}

【讨论】:

  • 谢谢@Marc。提交确实成功了,因为如果我从 /Users/gitissue/folder1/Outer 检查 git log,它会显示提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2014-12-29
  • 1970-01-01
  • 2021-11-05
  • 2011-05-11
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多