使用LibGit2Sharp编辑旧的提交消息

时间:2015-11-10 22:20:46

标签: git libgit2sharp

是否可以使用libgit2sharp编辑不是最新提交的提交的提交消息?

1 个答案:

答案 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;
            }
        }
    }
}