2015-11-10 3 views
0

Возможно ли отредактировать сообщение фиксации коммита, которое не является последним, с использованием libgit2sharp?Редактировать старые сообщения фиксации с помощью LibGit2Sharp

+1

_ "заменить определенное слово во всех сообщениях фиксации в репозитории ». _ - Вероятно, вы хотите узнать, как сделать« git filter-branch »с библиотекой под рукой. Пример использования фильтра-ветви: https://help.github.com/articles/remove-sensitive-data/. Обратите внимание, что это перепишет всю вашу ветку, поскольку каждая фиксация должна быть перезаписана. – cubrr

+0

Я просто понял, что это плохой пример, поэтому я удалил его. Мой вариант использования - пройти через все транзакции в репо, сгенерировать текст из diff (эта часть уже работает) и установить его как сообщение фиксации. @cubrr – Toast

ответ

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); 

Pre-переписан:

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 

Примечания: Как вы увидите в выводе выше журнала, то ПОР изменился, так же, как они будут с помощью git filter-branch так что вы должны сил любых толчков к ПУлЬТам ...

Я высоко рекомендую идти через испытательный стенд FilterBranchFixture.cs, как это лучшая документация RewriteHistory и вы найдете различные классы переписывания, как переписывание родителей фиксации, используются здесь и как ошибки обрабатываются ...

WARNING! Переписанная история будет иметь разные имена объектов для всех объектов и не будет сходиться к исходной ветке. Вы, , не сможете легко нажимать и распространять переписанную ветку на в верхней части исходной ветви. Пожалуйста, не используйте эту команду, если вы делаете , не знаете полных последствий и не используйте ее в любом случае, если достаточно простого одиночного фиксажа , чтобы исправить вашу проблему. (См "RECOVERING от входа Rebase" секции в 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; 
      } 
     } 
    } 
} 
+1

Удивительный ответ! :) – nulltoken

+0

Lol, Спасибо! ;-) Мне пришлось написать множество настраиваемых фильтров * Rewriter для контрактной работы, я знаю, что код reaaaalllllyyyy хорошо. :-p – SushiHangover

+0

Отличный ответ! Я должен был добавить сообщение: 'в' CommitRewriteInfo.From (c, message: c.Message.Replace ("foo", "StackOverflow")), чтобы заставить его работать. – Toast

Смежные вопросы