我想在Visual C ++项目中使用LibGit2Sharp将对工作目录的引用更改为其他位置。在我看来,Repository :: Init()和RepositoryOptions可以将工作目录设置为非默认位置。但是,我在这里要做的是在Repository :: Init()创建它之后更改对repo的工作目录的引用。 Repository :: Info :: WorkingDirectory似乎是一个只读属性,所以我无法通过这条路径改变它。
有关如何实现这一目标的任何想法?或相当于git_repository_set_workdir()未在LibGit2Sharp中公开。
答案 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 ;-)
}
LibGit2Sharp刚刚使用 PR #453 进行了更新。
除此之外,这使得repo.Init()
接受一个单独的git目录,该目录应该符合您的要求。