提交到Git对象数据库的优势是什么?

3
libgit2sharp问题的评论讨论中,突出了我可以针对对象数据库创建提交?
什么是提交到对象数据库?
为什么比进行普通的git add和git commit更有优势?
我正在尝试从另一个源代码控制系统SourceGear导入提交历史记录到Git。目前,我的逻辑只是循环遍历其他源代码控制系统中的文件,获取特定版本及其提交信息,然后执行repo.Index.Stage,然后repo.Commit。我假设这是正确的,我应该使用对象数据库吗?
1个回答

4

在使用LibGit2Sharp时,标准的提交工作流程如下:

using (var repo = new Repository("path/to/a/repository"))
{
    // do stuff

    repo.Index.Stage("path/to/file1");
    repo.Index.Stage("path/to/file2");

    repo.Commit("This is my commit", ....);

    // more stuff
}

然而,这需要一个非裸仓库:一个带有工作目录索引的仓库。

Stage()调用会将来自您的工作目录的文件注册到索引中。 Commit()调用会在对象数据库中创建一个不可变的时间戳快照,其中包含索引的内容。

自版本v0.9以来,LibGit2Sharp允许直接创建提交到对象数据库,而无需Stage()任何内容。实际上,这甚至适用于裸仓库。

除了Commits之外,使用新的ObjectDatabase API,可以创建BlobsTrees。一些可能使用的示例可以在ObjectDatabaseFixture单元测试中找到。

提交到对象数据库是什么意思?

实际上,提交总是最终存储到对象数据库中。新API公开了一些较低级别的操作,这些操作在某些高级脚本操作中可能很方便。

“为什么使用这种方法比普通的git add和git commit更有优势?”
“哇... 这是一个广泛的子问题。而且没有一个确定的答案;-)从我的头脑中,这里是一些潜在的答案:”
- “这允许您直接创建Blobs和/或Trees,而独立于任何Commit” - “使用标准的工作目录->索引->odb工作流程,只能准备一个提交。使用此API,您可以以非连续的方式创建Blobs和Trees,然后在最后时刻决定将哪个Tree与一个Commit相关联。” - “这个API还允许明确选择要创建的Commit应该承载哪些父项” - “Git是一个内容寻址的文件系统,是一个不可变的、追加的对象数据库。这个API方便了与标准源控制不同的其他使用方式。”
“‘目前我的逻辑只是循环遍历另一个源控制系统中的文件,获取某个版本及其提交信息,然后进行repo.Index.Stage,然后repo.Commit。我假设这是正确的,我应该使用对象数据库吗?’”
“考虑到您的用例,看起来标准工作流程已经足够了。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接