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

时间:2013-06-15 18:06:40

标签: visual-c++ libgit2 libgit2sharp

我想在Visual C ++项目中使用LibGit2Sharp将对工作目录的引用更改为其他位置。在我看来,Repository :: Init()和RepositoryOptions可以将工作目录设置为非默认位置。但是,我在这里要做的是在Repository :: Init()创建它之后更改对repo的工作目录的引用。 Repository :: Info :: WorkingDirectory似乎是一个只读属性,所以我无法通过这条路径改变它。

有关如何实现这一目标的任何想法?或相当于git_repository_set_workdir()未在LibGit2Sharp中公开。

1 个答案:

答案 0 :(得分: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的某些设置。处置回购后,这些临时设置将丢失。

  

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

绑定的libgit2方法是 invoked with three params ,第三个方法设置为false,因为我们不想在实例化存储库时保留临时设置。


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

  • LibGit2Sharp目前无法做到这一点。但是,通过添加可选参数,可以在调用Repository.Init()期间实现此目的。如果这似乎符合您的需求,我建议您 open an issue 关于此主题,或者甚至更好,发送一个Pull请求; - )

  • 另一种选择是你手动将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目录,该目录应该符合您的要求。