在Go中如何用go-git模拟git --work-tree命令操作裸仓库
解决方案
你不需要修改裸仓库的core.worktree配置(该配置和core.bare=true本身就是互斥的),直接绕开repo.Worktree()方法,手动实例化工作树对象绑定指定的工作目录即可,行为完全等价于命令行的git --git-dir --work-tree参数效果。
完整实现代码
package main import ( "path/filepath" "time" "github.com/go-git/go-billy/v5/osfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/worktree" ) func main() { // 1. 打开自定义命名的裸仓库 repo, err := git.PlainOpen("/path/to/.notgit") if err != nil { panic(err) } // 2. 转换工作目录为绝对路径 worktreePath, err := filepath.Abs("/path/to/your/worktree") if err != nil { panic(err) } // 3. 构造工作目录的文件系统实例 wtFs := osfs.New(worktreePath) // 4. 手动创建工作树实例,绕开裸仓库的Worktree()方法校验 wt, err := worktree.New(repo.Storer, wtFs, "") if err != nil { panic(err) } // 5. 正常执行add、commit操作,等价于带--git-dir和--work-tree参数的git命令 // 等价于 git add . _, err = wt.Add(".") if err != nil { panic(err) } // 等价于 git commit _, err = wt.Commit("批量提交文件", &git.CommitOptions{ Author: &object.Signature{ Name: "提交者名称", Email: "提交者邮箱", When: time.Now(), }, }) if err != nil { panic(err) } }
注意事项
- 全程不需要修改裸仓库的任何配置,保持
core.bare=true的默认状态即可,不会出现配置冲突报错 - 自定义命名的Git目录不需要做特殊适配,只要在
git.PlainOpen时传入正确的路径即可
内容的提问来源于stack exchange,提问作者Emil Walser
相关产品推荐
相关产品推荐

