2015-01-07 2 views
2

Идея такова. Мы запускаем внутренний «GitLab» с кучей репозиториев. Некоторые из этих репозиториев используются людьми UX, которые они хотели бы синхронизировать с веб-сайтом, используемым для того, чтобы показывать клиентам свою работу. Они попросили меня создать интерфейс, в котором использование может ввести URL-адрес своего репозитория, и я бы синхронизировал его с веб-сайтом.Создать структуру папок с помощью LibGit2Sharp?

Я создал запланированную задачу, которая будет читать веб-сайт для введенных репозиториев, а затем с помощью «LibGit2Sharp» получить файлы локально. Затем эти файлы будут переданы на веб-сайт с использованием FTP.

Отличный дизайн? Нет, но я все еще участвую, и это всего лишь внутренний проект, прежде чем я приземлюсь на другого клиента.

В аффекте я хотел бы получить репозиторий и поместить каждую ветку в свою собственную папку. Я успешно получил репозиторий и вытащил последнее. И я также сделал checkout для переключения ветвей, но тогда pull не работал, и он по-прежнему не выполняет мою файловую структуру. Есть ли простой способ сделать это, или мне нужно будет создать новый репозиторий для каждой ветки и сделать там чек?

TL; DR Есть ли простой способ получить репозиторий и его ветви в виде папок с помощью LibGit2Sharp?

Вот мой код прямо сейчас с значениями по умолчанию.

public class GitActions 
{ 
    public string url = ""; 
    public string RepoName = "test"; 
    public string path = @"C:\temp\rooted\test2"; 
    public string user = Properties.Settings.Default.User; 
    public string pass = Properties.Settings.Default.Password; 
    public Signature sig = new Signature("test", "test", new DateTimeOffset(2011, 06, 16, 10, 58, 27, TimeSpan.FromHours(2))); 

    public bool CloneRepo() 
    { 
     try 
     { 
      string clonedRepoPath = Repository.Clone(url, path, new CloneOptions() 
      { 
       CredentialsProvider = (_url, _user, _cred) => new UsernamePasswordCredentials 
       { 
        Username = user, 
        Password = pass, 
       } 
      }); 
      Console.WriteLine("Clone Success"); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Clone Failure"); 
      return false; 
     } 
    } 

    public bool PullRepo() 
    { 
     try 
     { 
      using (var repo = new Repository(path)) 
      { 
       repo.Network.Pull(sig, new PullOptions() 
       { 
        FetchOptions = new FetchOptions() 
        { 
         CredentialsProvider = (_url, _user, _cred) => new UsernamePasswordCredentials 
          { 
           Username = user, 
           Password = pass, 
          } 
        }, 
        MergeOptions = new MergeOptions() 
       }); 
       Console.WriteLine("Pull Success"); 
      } 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Pull Failure"); 
      return false; 
     } 
    } 

    public bool SwitchBranch(string name) 
    { 
     try 
     { 
      using (var repo = new Repository(path)) 
      { 

       repo.Checkout(repo.Branches[name], sig); 
      } 
      Console.WriteLine("Switch successful"); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Branch Switch Failed"); 
      return false; 
     } 

    } 
} 

ответ

1

Вместо того, чтобы делать Pull(), учитывая ваш сценарий, я предпочел бы посоветовать вам только выполнить Fetch(), который будет извлекать только обновленное содержимое.

Учитывая хранилище, следующий должен заботиться о создании новой папки для каждой ветви

var path = ... // Path where the repo has been cloned/fetched 
var branchesRootPath = ... // Target root directory where the new branches folder should be created 
var now = DateTimeOffset.UtcNow.Ticks; // Unique number to always create new folders 


using (var repo = new Repository(path)) 
{ 
    foreach (var b in repo.Branches) 
    { 
     // A branch name can contains a slash. 
     var branchFolderName = string.Format("{0}-{1}", now, b.Name.Replace("/", "-")); 
     var branchFolder = Directory.CreateDirectory(
      Path.Combine(branchesRootPath, branchFolderName)); 

     // Force will ensure a clean checkout and update the working directory 
     // with the content of the branch 
     repo.Checkout(b, new CheckoutOptions 
      { CheckoutModifiers = CheckoutModifiers.Force }); 

     // This body of this function is not described here, but should 
     // recursively copy the working directory into the branchFolder directory 
     // 
     // Note: Everything should be copied *except* the ".git" directory 
     CopyFilesRecursively(repo.Info.WorkingDirectory, branchFolder.FullName); 
    } 
} 
+0

Что такое «теперь» переменная должна быть в декларации «branchFolderName»? – user3236668

+0

Ох. Сожалею. Я забыл описать это. Это уникальный номер (тики), чтобы предотвратить перезапись предыдущей версии папок. – nulltoken