1

TLDR

我一直在搜索包Docs和官方示例,但不知道如何描述使用 go-git 添加子模块。我正在尝试git submodule add <url> <submod_name>,并将其配置为稀疏结帐

目标

我想使用 golang 的 go-git 包转换以下列表。我的总体目标是有一个稀疏签出的子模块,它将来自 Repo-A,然后整个 repo 将用于 Repo-B。我正在尝试从 Repo-A 获取内容,进行一些编辑并重新组织,然后将结果推送到 Repo-B。我在下面包含的所有内容都是第一步,特别是关于如何从头开始配置这个 repo+submod。

✅✅✅✅⬜ git init
_ git remote add -f <remote_name> <repo_url>
_ git clone --depth=1 --no-checkout <submod_repo_url> <submod_name>
_git submodule add <submod_repo_url> <submod_name>

  • 不知道怎么称呼它,我认为可以直接编辑 .git 目录,但这似乎很混乱。任何解释或建议将不胜感激。

git submodule absorbgitdirs

  • 不确定这是否需要,我找不到很好的描述它的作用,但它似乎不会导致问题?

git -C pinkbrain config core.sparseCheckout true(注意:仅适用于子模块)

  • 不知道如何使它工作,因为它是一个 .git 配置,但仅适用于子模块。也许只是创建一个新的 git.PlainOpen() 对象并以这种方式访问​​它的工作树?

echo "cir-1" >>.git/modules/<submod_name>/info/sparse-checkout
echo "cir-2" >>.git/modules/<submod_name>/info/sparse-checkout
git submodule update --force --checkout <submod_name>

  • 不确定这是否需要两个单独的电话?Worktree.Pull()& Worktree.Pull(),请参见下面的代码。

git pull <remote_name> main
git add .
git commit -S -m "commit example message"

我的问题

  1. 如何使用 go-git 添加子模块?
  2. 我需要单独的sw.Checkout(&git.CheckoutOptions位吗?如果是这样,我应该按什么顺序执行它们?
  3. 如何在主仓库或子模块中配置稀疏结帐?
  4. 有什么想法git submodule absorbgitdirs吗?任何有关它的信息将不胜感激

到目前为止我所拥有的(浓缩版)

注意:我有更多,但它与我的问题无关
这一位仅用于子模块更新,因为go-git文档不允许--checkout作为git.PullOptions()

// Should be equivalent to : git submodule update --force --checkout <submod_name>
// Get the repo object (could be git.plainOpen() too)
r, err := git.PlainClone(directory, false, &git.CloneOptions{
    <options>
})

// Get the Submodule WorkTree object
w, err := r.Worktree()
sub, err := w.Submodule(submodule)
sr, err := sub.Init()
sw, err := sr.Worktree()

// Get the Update the Submodule
err = sw.Pull(&git.PullOptions{
    <options>
}

// Checkout the submodule, Not sure if this is the right order?
err = sw.Checkout(&git.CheckoutOptions{
    <options>
}
4

1 回答 1

1

submodule.go从and的当前状态来看submodule_test.go,添加子模块似乎没有实现。

这意味着您需要client.go自己exec.Command使用git submodule add

于 2022-02-25T08:28:37.393 回答