Question

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.

Was it helpful?

Solution

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.Init() puts a folder under source control by creating a new repository on the filesystem. It returns an instance of the created repository.

The constructor of the Repository type gives you acces to an existing repository. This constructor accepts an optional RepositoryOptions parameter to override some options.

In order to fulfill your request I'd go with something like this

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 ;-)
}

Update:

The config file of the repo does not have the worktree attribute set to the right place, and the new working directory does not have a .git file pointing to the repo folder, as what you would expect.

This is the expected behavior. Passing a RepositoryOptions type to the constructor temporarily overrides some settings of the Repository. Once the repo is disposed, those temporary settings are lost.

I check the libgit2sharp source code for repository.cs and happen to notice that when it calls git_repository_set_workdir, it only has two arguments, as opposed to three

The bound libgit2 method is invoked with three params, the third one being set to false, because we do not want to persist the temporary settings when instanciating a repository.


Back to your original question: "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()."

  • This is currently not possible with LibGit2Sharp. However, it might be possible to make this happen DURING the call to Repository.Init() through the addition of an optional parameter. If this looks like something may fit your need, I'd suggest you to open an issue regarding this topic, or even better, send a Pull Request ;-)

  • Another option would be for you to manually set the core.worktree config variable to the expected location (You'd have to deal with the creation of the gitlink by yourself, though):

The code below demonstrates this last option:

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 ;-)
}

Update 2:

LibGit2Sharp has just been updated with PR #453.

Among other things, this makes repo.Init() accept a separate git directory, which should fit your requirements.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top