使用libgit2 - git2go从临时索引创建树对象

时间:2015-01-31 00:41:04

标签: libgit2

在命令行上,我可以执行以下操作:

$ 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。

一些指针(不,不是*指针)会很棒。

1 个答案:

答案 0 :(得分:0)

您创建的纯内存索引并不知道任何存储库,这就是您必须使用WriteIndexTo()并为其提供存储库的原因。出于同样的原因,任何想要使用文件的相对路径的方法都不起作用,因为索引不与存储库相关联,因此无法知道文件的位置。您需要使用IndexEntry代替并填写详细信息。

如果您需要相对路径方法,您可以从存储库中获取索引,而不是将其写回到光盘,而是从中创建一个树,就像使用无存储库的方法一样。然后,您可以忽略您在内存中所做的更改。

如果您需要重新使用该存储库中的索引,那么git_index_read()可以从光盘上的版本重新读取,但我认为此时可能不会包含在git2go中