-->

使用libgit2创建一个临时索引树对象 - git2go(Create a tree objec

2019-10-21 18:11发布

在命令行中,我可以做到以下几点:

$ touch foo

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git add -A

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git status -s
A  foo

$ git status -s
?? foo

$ GIT_INDEX_FILE=/tmp/tmp.d95ehfhUOffoo/index git write-tree
b8f7b1e052b441b53a969014803516bb7e681760

$ git cat-file -p b8f7b1e052b441b53a969014803516bb7e681760
100644 blob ae3fdc2989ae00d75ec106feadb78ed9f98ba41a  .gitignore
100644 blob 4e1e0d2f722485c7d284fb5cd7da855826e39b5a  .rspec
100644 blob 4bc0f1cdd31d348ddc0e91365c5be5a40104fa17  Dockerfile
100644 blob 7dc939ea79c2bd70d8d32416f9da8aa568029b05  Gemfile
100644 blob 145bb24613da12ffef73d5db34e89e2ea8e265ad  LICENSE.txt
100644 blob b8a804e12699a964dbeb97b7a632250192421294  README.md
100644 blob 809eb5616adcc0ebb78862099794489bd5b5b1a0  Rakefile
100644 blob a18114c31713746a33a2e70d9914d1ef3e781425  foo
040000 tree 3c8a789fc07c8f35fb96a7e77896cbbf2384e3d7  lib
040000 tree a5e7e5d6a85504f30912a8f65a498d17fe989c01  spec
100755 blob 0dd422b073bc1123cdf4979432822db773463537  test

需要注意的是,当我运行git status使用存储库索引它表明FOO尚未上演。

所以,我怎么能做到这一点与git2go? 一种尝试至今:

func Worktree() (string, error) {

› repo, err := git.OpenRepository(".")
› if err != nil {
› › return "", err
› }

› index, err := git.NewIndex()
› if err != nil {
› › return "", err
› }

› err = index.AddAll([]string{"."}, git.IndexAddDefault, nil)
› if err != nil {
› › return "", err
› }

› treeOid, err := index.WriteTreeTo(repo)
› if err != nil {
› › return "", err
› }

› return treeOid.String(), nil
}

结果是:

Error:  Could not add paths to index. Index is not backed up by an existing repository.

如何用仓库存储指数相关联的?

似乎有一些libgit功能,如git_index_opengit_index_read还没有在git2go得到落实。 我已经扫描了大量的代码,并阅读了大量的libgit2的API。

一些指针(不,不是*指针)将是巨大的。

Answer 1:

您所创建的纯粹的内存索引不知道任何信息库,这就是为什么你必须使用WriteIndexTo()并给它的存储库。 出于同样的原因,这要使用相对路径的文件,将无法正常工作,因为索引不与仓库相关联,因此无法知道这些文件的任何方法。 你需要使用IndexEntry代替和补充细节。

如果你需要的相对路径的方法,您可以从资料库抓取索引,只是把它写回磁盘,但是从它创建一棵树,就像你与你的资料库,少一个呢。 然后,您可以不理会你在内存中完成的改变。

如果你需要从仓库重新使用索引,有git_index_read()从盘上的版本重新读取,但我认为它可能无法在git2go此时包裹。



文章来源: Create a tree object from a temporary index using libgit2 - git2go
标签: libgit2