NGit rebase创建新的提交

时间:2012-07-02 19:27:03

标签: c# git

我有一些在git中运行的功能,我正在尝试移植到NGit。我的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运行脚本时,情况似乎并非如此。 (即,如果没有更改文件,则服务器上不会生成任何内容。)

我在这里做错了吗?关于如何在rebase之后有什么不同于本地到远程的推送的任何聪明的想法?

谢谢!

1 个答案:

答案 0 :(得分: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;
}

然后我在执行add / commit之前检查这个:

 // 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();
  }

现在它的工作方式与上面的脚本相同。酷!