7

我有一个裸存储库,我需要在其中添加和提交一组文件。据我了解,将文件添加到索引需要一个worktree。在命令行上使用git,我会将git-dir选项设置为指向裸目录,同时将work-tree选项设置为指向要添加到索引的文件所在的工作树。像这样:

$ git --git-dir /path/to/.git --work-tree /path/to/worktree add ...

值得一提的是,“.git”目录不是,也不能简单地命名为“.git”。它实际上是一个“自定义”“.git”目录。喜欢git --git-dir /path/to/.notgit ...

我尝试设置core.worktree配置选项。但是,core.bare设置为true这会导致致命错误。两者都来自命令行:

$ git --git-dir /path/to/.notgit config core.worktree /path/to/worktree
$ git --git-dir /path/to/.notgit add ...
warning: core.bare and core.worktree do not make sense
fatal: unable to set up work tree using invalid config

并使用go-git

r, err := git.PlainOpen("/path/to/.notgit")
panicOnError(err)

c, err := r.Config()
panicOnError(err)

fmt.Println(c.Core.IsBare) // true

c.Core.Worktree = "/path/to/worktree"

err = r.SetConfig(c)
panicOnError(err)

_, err = r.Worktree() // panic: worktree not available in a bare repository
panicOnError(err)

我的一个想法是依靠该git.PlainOpenWithOptions功能,希望能够让我提供一个工作树作为选项。然而,看看git.PlainOpenOptions结构类型,这很快就崩溃了。

type PlainOpenOptions struct {
    // DetectDotGit defines whether parent directories should be
    // walked until a .git directory or file is found.
    DetectDotGit bool
    // Enable .git/commondir support (see https://git-scm.com/docs/gitrepository-layout#Documentation/gitrepository-layout.txt).
    // NOTE: This option will only work with the filesystem storage.
    EnableDotGitCommonDir bool
}

git --work-tree ...我该如何模仿go-git


编辑 1:解释说“.git”不完全命名为“.git”。

4

1 回答 1

1

当您使用git.Open()时,它基本上将worktree存储库结构中的字段设置为nil,因为它在PlainOpenWithOptions内部使用默认值DetectDotGitas false。如果您使用以下构造函数,您将看到,未跟踪的文件将被成功添加。

    r, err := git.PlainOpenWithOptions("/path/to/.git",&git.PlainOpenOptions{DetectDotGit: true})
    panicOnError(err)
    
    c, err := r.Config()
    panicOnError(err)
    
    fmt.Println(c.Core.IsBare) // true
    
    c.Core.Worktree = "/path/to/worktree"
    
    err = r.SetConfig(c)
    panicOnError(err)
    
    _, err = r.Worktree() // panic: worktree not available in a bare repository
    panicOnError(err)

// added this part for test
    workTree, werr := r.Worktree()
    panicOnError(werr)

    hash, hashErr := workTree.Add("a.txt")
    if hashErr != nil {
        log.Fatal(hashErr)
    }
fmt.Println(hash)

在执行代码之前 在此处输入图像描述

go代码执行后 在此处输入图像描述

于 2021-11-14T21:18:04.697 回答