2017-03-07 2 views
2

私はlibgit2sharpをC#ソリューションで使用してブランチに切り替え、最新の変更を引き込みます。私が使用しているコードは次のとおりです。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にリモートリポジトリのパスを伝える方法を理解できませんでした。誰でも何か提案がありますか?

この問題について調査しているうちに、私はこれを見つけました:https://github.com/libgit2/libgit2sharp/issues/1235。基本的に、libgit2sharpの開発者は私が見ている正確な問題を記述していますが、修正のためのコードは提供していません。

もう1つ注意してください:このリポジトリからの変更を元に戻すことはありません。私は自動ビルドのためにそれを引っ張っているので、ローカルの変更を無視または上書きできます。私はちょうど最新のコードを取得する必要があります。

解決策: 上記のコードを、私が働いているソリューションで更新しました。ブランチをチェックアウトしたときに、チェックアウトしているブランチのisRemoteフラグがtrueに設定されていることを確認することを本当に慎重にする必要があります。リモートでないブランチをチェックアウトすると、リモートを '。'に設定します。あなたのgitの設定ファイルで、手動で修正する必要があります。有効なリモートがない場合、ブランチの変更をプルすることはできません。彼らは、このチェックを追加しない限り

はlibgit2sharpのwiki上のサンプルコードを使用しないでください

答えて

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 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

[OK]を、あなたは役に立ちました答えが、私はいくつかのSTIL probleを見ています:SomeLocalBranchNameは今remotes/origin/work-btlsを追跡していることを確認するためにgitを使用それとms。私がこのチェックアウトの後に引っ張っても、同じエラーメッセージが表示されます。私はまたisremoteチェックブロックの外にrepo.checkoutを移動する必要があると思う、そうでなければ最初の作成時にチェックアウトするだけです。チェックアウトコードを更新して、私が変更したものを確認することができます。 – MadTigger

+0

コードサンプルで作成されたブランチをチェックしたところ、正しいリモートを指しているように見えましたが、フォローアップ要求が以前と同じ例外をスローします。 – MadTigger

+0

@MadTiggerコードの完全な置き換えを書いていませんでした。トラッキングブランチの例を示しています。あなたのエラーの時点で、あなたがcmd行に落とした場合、gitは同じエラーで返答しますか?もしそうなら、(libgit2sharpを介して)チェックアウトしたブランチに割り当てられた有効な追跡ブランチがありますか? – SushiHangover

関連する問題