是否可以使用libgit2sharp编辑不是最新提交的提交的提交消息?
答案 0 :(得分:2)
git filter-branch
的类比是Repository.Refs.RewriteHistory
。
作为示例,让我们用foo
替换foo
来重写包含StackoverFlow
的所有提交消息:
repo.Refs.RewriteHistory (new RewriteHistoryOptions {
OnError = OnError,
OnSucceeding = OnSucceeding,
CommitHeaderRewriter = c =>
CommitRewriteInfo.From (c, c.Message.Replace ("foo", "StackOverflow")),
}, commitsToRewrite);
<强>预重写:强>
git log --oneline
b859690 Commit foo 3
327f702 Commit foo 2
75ac0b8 Commit foo 1
发表重写:强>
git log --oneline
dc156e3 Commit StackOverflow 3
587f6c3 Commit StackOverflow 2
894361f Commit StackOverflow 1
注意:正如您将在上面的日志输出中看到的那样,SHA已经发生变化,就像通过git filter-branch
一样,因此您必须强制任何推动遥控......
我高度建议通过测试夹具FilterBranchFixture.cs
,因为这是RewriteHistory
的最佳文档,你会发现不同的重写类,比如重写父级的提交,在这里使用以及如何处理错误......
WARNING!重写的历史记录将具有不同的对象名称 所有对象,不会与原始分支汇合。您 将无法轻松推送和分发重写的分支 原始分支的顶部。如果你这样做,请不要使用此命令 不知道完整的含义,并且无论如何都要避免使用它,如果简单的话 单一提交就足以解决您的问题。 (参见&#34;恢复 来自UPSTREAM REBASE&#34; git-rebase(1)中的部分以获取更多信息 关于重写已发表的历史。)
剪切/粘贴示例:
using System;
using LibGit2Sharp;
namespace gitrewrite
{
class MainClass
{
private static bool succeeding;
private static Exception error;
public static void Main (string[] args)
{
var repo = new Repository ("/Users/sushi/code/XamTests/RepoTestBed");
// Assuming you might pre-filter, but for this example take ALL commits
var commitsToRewrite = repo.Commits;
repo.Refs.RewriteHistory (new RewriteHistoryOptions {
OnError = OnError,
OnSucceeding = OnSucceeding,
CommitHeaderRewriter = c =>
CommitRewriteInfo.From (c, c.Message.Replace ("foo", "StackOverflow")),
}, commitsToRewrite);
}
private static Action OnSucceeding {
get {
succeeding = false;
return () => succeeding = true;
}
}
private static Action<Exception> OnError {
get {
error = null;
return ex => error = ex;
}
}
}
}