使用libgit2sharp将引用移动到工作目录



我想在Visual c++项目中使用LibGit2Sharp将对工作目录的引用更改为不同的地方。在我看来,Repository::Init()与RepositoryOptions可以将工作目录设置为非默认位置。然而,我在这里要做的是在Repository::Init()创建repo之后更改对repo工作目录的引用。Repository::Info::WorkingDirectory似乎是一个只读属性,所以我不能通过此路由更改它。

对如何实现这一点有什么想法吗?或者git_repository_set_workdir()在LibGit2Sharp中没有暴露。

我在这里要做的是,在Repository::Init()创建repo后,更改对repo工作目录的引用。

Repository.Init()通过在文件系统上创建一个新的存储库,将一个文件夹置于源代码控制之下。它返回创建的存储库的实例。

Repository类型的构造函数允许您访问现有的存储库。这个构造函数接受一个可选的RepositoryOptions参数来覆盖一些选项。

为了满足你的要求,我将这样做

var path ="D:pathtoyourrepo";
using (var repo = Repository.Init(path)
{
   // Do nothing here
}
var newWorkdir ="D:pathtoyourotherworkingdirectory";
var options = new RepositoryOptions { WorkingDirectoryPath = newWorkdir };
using (var repo = new Repository(path, options))
{
   // Do YOUR amzing stuff ;-)
}

更新:

repo的配置文件没有将worktree属性设置到正确的位置,并且新的工作目录没有像你期望的那样有一个指向repo文件夹的.git文件。

这是预期的行为。将RepositoryOptions类型临时传递给构造函数将覆盖Repository的一些设置。一旦repo被处置,这些临时设置将丢失。

我检查了libgit2sharp源代码中的repository.cs,碰巧注意到当它调用git_repository_set_workdir时,它只有两个参数,而不是三个

绑定的libgit2方法是用三个参数调用的,第三个参数被设置为false,因为我们不想在实例化存储库时持久化临时设置。


回到你最初的问题:"我在这里要做的是,在Repository::Init()创建repo之后,将其更改为工作目录的引用。"

  • 这是目前LibGit2Sharp不可能的。但是,通过添加一个可选参数,在调用Repository.Init()期间可能会发生这种情况。如果这看起来像是适合你的需要,我建议你打开一个问题关于这个主题,或者更好的是,发送一个Pull Request;-)

  • 另一个选择是你手动设置core.worktree配置变量到预期的位置(你必须自己处理gitlink的创建,虽然):

下面的代码演示了最后一个选项:
var path ="D:pathtoyourrepo";
// Note the use of forward slashes here
var newWorkdir ="D:/path/to/your/other/working/directory"; 
using (var repo = Repository.Init(path)
{
   repo.Config.Set("core.worktree", newWorkdir);
}
using (var repo = new Repository(path))
{
   // Do YOUR amzing stuff ;-)
}
更新2:

LibGit2Sharp刚刚更新了PR #453

除此之外,这使得repo.Init()接受一个单独的git目录,它应该符合您的要求。

最新更新