如果我有一个裸存储库,并且我想从中添加、编辑和删除文件,我该如何使用 LibGit2Sharp 执行此操作?
我看到每个 Commit 都有一个包含 TreeEntry 对象的 Tree 对象。是否可以添加、编辑和删除这些 TreeEntry(s)?如果是这样,该指数是否会反映这些变化正在等待并需要进行?
谢谢!
如果我有一个裸存储库,并且我想从中添加、编辑和删除文件,我该如何使用 LibGit2Sharp 执行此操作?
我看到每个 Commit 都有一个包含 TreeEntry 对象的 Tree 对象。是否可以添加、编辑和删除这些 TreeEntry(s)?如果是这样,该指数是否会反映这些变化正在等待并需要进行?
谢谢!
如果我有一个裸存储库,并且我想从中添加、编辑和删除文件,我该如何使用 LibGit2Sharp 执行此操作?
裸存储库是一个“服务器端”存储库,您可以从中获取/拉取更改并将更新推送到其中。
它没有 aWorking Directory
也没有Index
。因此,不能直接添加、编辑或删除文件。您应该在“标准”存储库(带有工作文件夹)中准备提交,然后将提交推送到“裸”中央存储库。
注意:一些git 管道命令和libgit2 低级函数允许您绕过这些限制。但是,它是一个有点高级的工具包,您必须准备好深入了解 Git 内部结构才能找到自己的方法:) LibGit2Sharp 没有公开这些功能。
我看到每个 Commit 都有一个包含 TreeEntry 对象的 Tree 对象。是否可以添加、编辑和删除这些 TreeEntry(s)?如果是这样,该指数是否会反映这些变化正在等待并需要进行?
A Commit
, aTree
或 aBlob
是只读的 git 对象。您不能将 a “添加”TreeEntry
到 aTree
中,也不能修改现有的Commit
.
git commit 修饰符(--amend)可以给人以提交已就地更新的印象。情况并非如此:一个全新的提交被重新创建为旧提交的父级的子级。然后HEAD
从旧提交移到新提交。
LibGit2Sharp v0.9.0版本公开了一些低级操作,现在允许直接与存储库的对象数据库进行交互,甚至是裸操作。
利用这些功能,可以创建 Blob、树和提交,而无需涉及索引或工作目录。
因此,现在可以加载现有的树,在内存中对其进行更新,然后将其持久化回对象数据库中。当然,这将创建一棵新树,而前一棵树将保持不变。
可以在ObjectDatabaseFixture.cs文件中找到一些演示这些功能的单元测试。
请谷歌“计算机科学家的 git”以了解 DAG(有向无环图)。更改提交、树或对象实际上会创建一个新的。编辑任何这些东西的想法是错误的想法。如果内容发生更改,您只能创建新的。