0

I want to change the reference to the working directory to a different place using LibGit2Sharp in a Visual C++ project. it seems to me that Repository::Init() with RepositoryOptions can set the working directory to a non-default place. What I am trying to do here, however, is to change the reference to the working directory for the repo AFTER it is created by Repository::Init(). Repository::Info::WorkingDirectory seems to a be read-only property, so I can't change it through this route.

Any thoughts on how to accomplish this? or the equivalent of git_repository_set_workdir() is not exposed in LibGit2Sharp.

4

1 回答 1

2

然而,我在这里尝试做的是在 Repository::Init() 创建它之后更改对 repo 工作目录的引用。

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

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

为了满足您的要求,我会选择这样的东西

var path ="D:\path\to\your\repo";
using (var repo = Repository.Init(path)
{
   // Do nothing here
}

var newWorkdir ="D:\path\to\your\other\working\directory";

var options = new RepositoryOptions { WorkingDirectoryPath = newWorkdir };

using (var repo = new Repository(path, options))
{
   // Do YOUR amzing stuff ;-)
}

更新:

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

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

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

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


回到你原来的问题:“然而,我在这里要做的是在 Repository::Init() 创建它之后更改对 repo 工作目录的引用。”

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

  • 另一种选择是让您手动将core.worktree配置变量设置为预期位置(不过,您必须自己处理 gitlink 的创建):

下面的代码演示了最后一个选项:

var path ="D:\path\to\your\repo";

// 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 目录,它应该符合您的要求。

于 2013-06-15T18:39:50.443 回答