是否可以使用libgit2sharp编辑不是最新提交的提交消息?
发布于 2015-11-11 00:23:00
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 1Post-rewrite:
git log --oneline
dc156e3 Commit StackOverflow 3
587f6c3 Commit StackOverflow 2
894361f Commit StackOverflow 1注意:正如您将在上面的日志输出中看到的那样,SHAs已经改变了,就像它们通过git filter-branch进行的那样,您将不得不强制向远程服务器推送.
我强烈建议查看测试夹具FilterBranchFixture.cs,因为这是RewriteHistory的最好文档,您将发现不同的重写类,比如重写提交的父级、在这里使用以及如何处理错误.
警告!重写的历史记录将对所有对象都有不同的对象名称,并且不会与原始分支收敛。您将无法轻松地在原始分支之上推送和分发重写的分支。如果您不知道该命令的全部含义,请不要使用此命令,如果一个简单的提交就足以解决您的问题,请避免使用它。(有关重写已发布历史的进一步信息,请参阅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;
}
}
}
}https://stackoverflow.com/questions/33640779
复制相似问题