我在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在同一台计算机上运行脚本时,似乎不是这种情况。 (即,如果未更改任何文件,则服务器上不会生成任何文件。)
我在这里做错什么了吗?关于仅在重新设置基准后从本地到远程有任何不同的情况下,如何进行推送的任何明智的想法?
谢谢!
最佳答案
回答我自己的问题...希望这可以帮助某人。我实现了一个“ 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();
}
现在它的工作原理与上面的脚本相同。凉!