2017-03-07 155 views
2

我在c#解決方案中使用libgit2sharp切換到分支並引入最新的更改。這裏是我使用的代碼:使用libgit2sharp從分支拉最新

public void FetchAll() 
    { 
     using (var repo = new Repository(_LocalGitPath)) 
     { 
      foreach (Remote remote in repo.Network.Remotes) 
      { 
       FetchOptions options = new FetchOptions(); 
       options.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials() 
       { 
        Username = _UserName, 
        Password = _Password 
       }); 
       repo.Network.Fetch(remote, options); 
      } 
     } 
    } 
    public string CheckoutBranch(string branchName) 
    { 
     using (var repo = new Repository(_LocalGitPath)) 
     { 
      var trackingBranch = repo.Branches[branchName]; 

      if (trackingBranch.IsRemote) 
      { 
       branchName = branchName.Replace("origin/", string.Empty); 

       var branch = repo.CreateBranch(branchName, trackingBranch.Tip); 
       repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName); 
       Commands.Checkout(repo, branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force }); 
      } 
      else 
      { 
       Commands.Checkout(repo, trackingBranch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force }); 
      } 

      return branchName; 
     } 
    } 
    public void PullBranch(string branchName) 
    { 
     using (var repo = new Repository(_LocalGitPath)) 
     { 
      PullOptions options = new PullOptions(); 

      options.MergeOptions = new MergeOptions(); 
      options.MergeOptions.FailOnConflict = true; 

      options.FetchOptions = new FetchOptions(); 
      options.FetchOptions.CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => new UsernamePasswordCredentials() 
      { 
       Username = _UserName, 
       Password = _Password 
      }); 

      repo.Network.Pull(new Signature(_UserName, _Password, new DateTimeOffset(DateTime.Now)), options); 
     } 
    } 

我沒有問題提取,並簽出一個分支。當我嘗試最新的時候,我收到一個錯誤,說'沒有當前分支的跟蹤信息'。我相信這意味着本地分支不知道正確的遠程存儲庫將從哪個存儲庫中進行更改,但我一直無法弄清楚如何告訴libgit2sharp遠程repo路徑是什麼。任何人有任何建議?

在對這個問題做研究時,我發現這個:https://github.com/libgit2/libgit2sharp/issues/1235。本質上,libgit2sharp開發描述了我所看到的確切問題,但不提供任何修補程序的代碼。

一個附加說明:我將永遠不會合並或推送從此存儲庫返回的任何更改。我拉它來自動構建,所以我們可以忽略或覆蓋任何本地更改。我只需要獲取最新的代碼。

解決方案: 我已經更新了上面的代碼與我工作的解決方案。您需要非常小心,以確保在檢出分支時檢查分支上的isRemote標誌是否設置爲true。如果你簽出一個不是遠程的分支,它將把遠程設置爲'。'。在你的git配置文件中,你需要手動修復它。如果沒有有效的遙控器,您將無法取消分支更改。

,除非他們增加這個檢查中不要使用代碼示例在libgit2sharp維基

回答

2

您可以設置使用的Refspec上的本地分支跟蹤BRACH信息:

using (var repo = new Repository("/Users/sushi/code/redux/mono")) 
{ 
    var trackingBranch = repo.Branches["remotes/origin/work-btls"]; 
    if (trackingBranch.IsRemote) 
    { 
     var branch = repo.CreateBranch("SomeLocalBranchName", trackingBranch.Tip); 
     repo.Branches.Update(branch, b => b.TrackedBranch = trackingBranch.CanonicalName); 
     repo.Checkout(branch, new CheckoutOptions { CheckoutModifiers = CheckoutModifiers.Force }); 
    } 
} 

你可以使用git驗證SomeLocalBranchName現在正在跟蹤remotes/origin/work-btls

>>>git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads 

SomeLocalBranchName <- remotes/origin/work-btls 
master <- origin/master 

>>>git status 

On branch SomeLocalBranchName 
Your branch is up-to-date with 'remotes/origin/work-btls'. 
+0

好吧,你的答案是有幫助的,但我還是老樣子看到一些proble與它毫秒。如果在結帳後執行拉取操作,我仍會收到相同的錯誤消息。我也認爲你需要將repo.checkout移出isremote check block,否則你只能在初始創建時簽出。我更新了結帳代碼,以便查看我已更改的內容。 – MadTigger

+0

我檢查了使用代碼示例創建的分支,並且它們似乎指向正確的遙控器,但後續拉取請求會拋出與以前相同的異常。 – MadTigger

+0

@MadTigger我沒有爲你的代碼寫一個完整的替代品,只是顯示了一個跟蹤分支的例子。在你的錯誤點,如果你下降到一個cmd行,git是否回覆同樣的錯誤?如果是這樣,是否有一個有效的跟蹤分支分配給你有結賬的分支(通過libgit2sharp)? – SushiHangover