2

NGitに移植しようとしているいくつかの機能がgitで機能しています。私のgitスクリプトは次のようになります:

git add . 
git commit -a -m "Auto Commit"
git fetch
git rebase
git push

(競合処理の詳細は省略しました。ここでは関係ありません。)

これをNGitに移植すると、次のようになります。

// Open a connection to the repository
Git _git = Git.Open(MyRepoPath);

// Add all new files to the commit.
_git.Add().AddFilepattern(".").Call();

// execute the commit, but don't push yet.
_git.Commit().SetMessage(CommitMsg).SetAll(true).Call();

// fetch all remote files
_git.Fetch().Call();

// rebase 
_git.Rebase().SetUpstream("FETCH_HEAD").Call();

// push all changes
_git.Push().Call();

見た目はほとんど同じです...私が見る唯一の違いは、私のgitサーバーでは、NGitプログラムが実行されるたびに、リポジトリにプッシュされる新しいコミットがあることです。これは、同じマシンでmsysgitを介してスクリプトを実行しているだけの場合には当てはまらないようです。(つまり、ファイルが変更されていない場合、サーバー上には何も生成されません。)

ここで私が間違っていることはありますか?リベース後にローカルからリモートに何か違うものがある場合にのみプッシュする方法についての賢いアイデアはありますか?

ありがとう!

4

1 に答える 1

0

私自身の質問に答える...うまくいけば、これは誰かを助ける. 次のように「isDirty」関数を実装しました (NGit は JGit ライブラリから IsClean を実装していないように見えるため)。

private bool IsDirty(Status status)
{
    return status.GetAdded().Count + status.GetChanged().Count + status.GetConflicting().Count +
           status.GetMissing().Count + status.GetModified().Count + status.GetRemoved().Count +
           status.GetUntracked().Count > 0;
}

次に、追加/コミットを行う前にこれを確認します。

 // Check if anything needs a'doin'
 if(IsDirty(_git.Status().Call()))
 {
    // Add all new files to the commit.
     _git.Add().AddFilepattern(".").Call();

     // execute the commit, but don't push yet.
     _git.Commit().SetMessage(CommitMsg).SetAll(true).Call();
  }

これで、上記のスクリプトと同じように動作します。涼しい!

于 2012-07-03T12:42:52.903 に答える