Как я могу вычесть два файла исправлений svn?

#svn #patch

#svn #исправление

Вопрос:

Я хотел бы иметь систему очередей исправлений (например, предлагаемую guilty или mercurial-mq) поверх SVN.

SVN уже может экспортировать файлы исправлений, которые представляют разницу между удаленной и рабочей копией. Я уже могу использовать это и создавать исправление каждый раз, когда я что-то меняю, но этот патч также будет содержать все предыдущие изменения, которые я сделал. Обычно это не создает проблем при применении исправления, поскольку избыточные части будут проигнорированы.

Тем не менее, я бы хотел, чтобы мои исправления содержали только изменения, внесенные мной из последнего исправления, которое я сохранил в текущей рабочей копии, чтобы они были более гибкими. Я могу удалить исправление, чтобы «отменить» его, или я могу применить только подмножество исправлений. Чтобы сделать это, я думаю, единственное, что мне нужно, это инструмент, который может вычесть два исправления.

Например, учитывая 001.patch:

 Index: myrepo/myfile.h
===================================================================
--- myrepo/myfile.h (revision 200)
    myrepo/myfile.h (working copy)
@@ -283,1  283,1 @@
    void f();
  

и 002.tmp.patch:

 Index: myrepo/myfile.h
===================================================================
--- myrepo/myfile.h (revision 200)
    myrepo/myfile.h (working copy)
@@ -283,1  283,1 @@
    void f();

Index: myrepo/myfile.c
===================================================================
--- myrepo/myfile.c (revision 200)
    myrepo/myfile.c (working copy)
@@ -283,1  283,1 @@
    void f() { }
  

Я хотел бы получить 002.patch:

 Index: myrepo/myfile.c
===================================================================
--- myrepo/myfile.c (revision 200)
    myrepo/myfile.c (working copy)
@@ -283,1  283,1 @@
    void f() { }
  

Конечно, это гораздо менее очевидно, когда что-то удаляется или изменяется. В любом случае, я был бы достаточно доволен вычитанием на уровне куска (которое просто берет 002.tmp.patch и удаляет все куски, которые имеют идентичную копию в 001.patch)

Ответ №1:

interdiff Инструмент может делать именно то, что я просил. http://www.linuxcommand.org/man_pages/interdiff1.html