Зеркально отразите репо, используя libgit2sharp (или другую библиотеку c #) - PullRequest
0 голосов
/ 19 февраля 2019

Я хочу клонировать репо, и я хочу, чтобы клон имел все теги из оригинала.Я могу сделать это вручную, вот так

$ git clone --mirror https://github.com/{org}/{SourceProjectName}.git
$ cd {SourceProjectName}.git
$ git push --mirror https://github.com/{org}/{ProjectName}

Кажется, libgit2sharp - лучший способ сделать это, но если есть лучший способ, дайте мне знать.

Я не понимаю, каксделать это с помощью libgit2sharp Кажется, мне нужно сделать клон, затем каким-то образом скопировать refs. Затем я должен перебрать все эти refs и поставить их все ... затем сделать коммит?Я начал работать над всем этим, но мне кажется, что я заново изобретаю колесо ...

Где я смотрел до сих пор:

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я не знаю, является ли это идеальным решением, но, похоже, это помогает:

private void DuplicateGitHubRepo()
{
    var clonePath = Path.Combine(Path.GetTempPath(), "Temp-" + Guid.NewGuid() + ".git");
    var co = new CloneOptions
    {
        CredentialsProvider = GetGitCredentials()
    };

    Repository.Clone(SourceProjectUrl+".git", clonePath, co);
    using (var repo = new Repository(clonePath))
    {
        repo.Network.Remotes.Update("origin", x => x.Url = TargetProjectUrl);
        var options = new PushOptions
        {
            CredentialsProvider = GetGitCredentials()
        };
        repo.Network.Push(repo.Network.Remotes["origin"],repo.Refs.Select(x=>x.CanonicalName),options);
    }
}
0 голосов
/ 19 февраля 2019

У вашей связанной проблемы было решение.

Клон git mirror - это просто клон с удаленным источником, установленным в +refs/*:refs/*

using (var repo = new Repository(Repository.Init(@"path\to\local.git", true)))
{
    var remote = repo.Network.Remotes.Add("origin", "https://github.com/{org}/{SourceProjectName}.git", "+refs/*:refs/*");
    repo.Network.Fetch(remote /* anything for report progress */);
}

Метод RemoteCollection.Add () выглядитнапример: public virtual Remote Add(string name, string url, string fetchRefSpec)

По сути, третий параметр - это то место, где вам нужно установить эту специальную ссылку.

...