如何将TreeEntry添加到Commit的Tree集合中?

时间:2012-01-30 18:24:10

标签: c# git libgit2sharp

如果我有一个裸存储库并且我想要添加,编辑和删除文件,我该如何使用LibGit2Sharp执行此操作?

我看到每个Commit都有一个包含TreeEntry对象的Tree对象。是否可以添加,编辑和删除这些TreeEntry?如果是这样,指数是否会反映出这些变化正在等待并且需要上演?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

如果我有一个裸存储库并且我想从中添加,编辑和删除文件,我该如何使用LibGit2Sharp执行此操作?

裸存储库是一个“服务器端”存储库,您可以从中获取/提取更改以及推送更新。

它没有Working Directory也没有Index。因此,不能直接添加,编辑或删除文件。您应该在“标准”存储库(带有工作文件夹)中准备您的提交,然后将您的提交推送到“裸”中央存储库。

注意:一些 git管道命令 libgit2低级别函数允许您解决这些限制。但是,它是一个有点高级的工具包,你必须准备好潜入Git Internals以便找到你的方法:) LibGit2Sharp不公开这些功能。

  

我看到每个Commit都有一个包含TreeEntry对象的Tree对象。是否可以添加,编辑和删除这些TreeEntry?如果是这样,指数是否会反映出这些变化正在等待并且需要上演?

CommitTreeBlob是只读git对象。您无法向TreeEntry“添加”Tree,也无法修改现有的Commit

git commit修饰符( - 修订)可以让人觉得提交已就地更新了。情况并非如此:将整个新提交重新创建为旧提交的父级的子级。然后HEAD从旧提交移动到新提交。

更新

发布LibGit2Sharp的 v0.9.0 会暴露一些低级操作,这些操作现在允许一个人直接与存储库的对象数据库进行交互,甚至是裸存储库的对象数据库。

利用这些功能,可以创建Blob,Trees和Commits,而无需涉及索引和工作目录。

因此,现在可以加载现有树,在内存中更新它,然后将其保留在对象数据库中。当然,这将创建一个新的树,前一个将保持不变。

可以在 ObjectDatabaseFixture.cs 文件中找到一些展示这些功能的单元测试。

答案 1 :(得分:0)

请谷歌“git for computer scientist”了解DAG(有向无环图)。更改提交,树或对象实际上将创建一个新的。你编辑任何这些东西的想法是错误的想法。如果内容发生变化,您只能创建新的。