在使用LibGit2Sharp时,标准的提交工作流程如下:
using (var repo = new Repository("path/to/a/repository"))
{
repo.Index.Stage("path/to/file1");
repo.Index.Stage("path/to/file2");
repo.Commit("This is my commit", ....);
}
然而,这需要一个非裸仓库:一个带有
工作目录和
索引的仓库。
Stage()
调用会将来自您的工作目录的文件注册到索引中。 Commit()
调用会在对象数据库中创建一个不可变的时间戳快照,其中包含索引的内容。
自版本v0.9以来,LibGit2Sharp允许直接创建提交到对象数据库,而无需Stage()
任何内容。实际上,这甚至适用于裸仓库。
除了Commits之外,使用新的ObjectDatabase
API,可以创建Blobs
或Trees
。一些可能使用的示例可以在ObjectDatabaseFixture单元测试中找到。
提交到对象数据库是什么意思?
实际上,提交总是最终存储到对象数据库中。新API公开了一些较低级别的操作,这些操作在某些高级脚本操作中可能很方便。
“为什么使用这种方法比普通的git add和git commit更有优势?”
“哇... 这是一个广泛的子问题。而且没有一个确定的答案;-)从我的头脑中,这里是一些潜在的答案:”
- “这允许您直接创建Blobs和/或Trees,而独立于任何Commit”
- “使用标准的
工作目录->索引->odb
工作流程,只能准备一个提交。使用此API,您可以以非连续的方式创建Blobs和Trees,然后在最后时刻决定将哪个Tree与一个Commit相关联。”
- “这个API还允许明确选择要创建的Commit应该承载哪些父项”
- “Git是一个内容寻址的文件系统,是一个不可变的、追加的对象数据库。这个API方便了与标准源控制不同的其他使用方式。”
“‘目前我的逻辑只是循环遍历另一个源控制系统中的文件,获取某个版本及其提交信息,然后进行repo.Index.Stage,然后repo.Commit。我假设这是正确的,我应该使用对象数据库吗?’”
“考虑到您的用例,看起来标准工作流程已经足够了。”