DVCS обнаруживает движение блока кода - PullRequest
2 голосов
/ 31 марта 2012

Я ищу систему контроля версий, которая способна определить, перемещена ли функция внутри файла. Например, есть этот файл "Foo.java", и он содержит функции "a ()", "b ()" и "c ()".

public class Foo
{
    void a()
    {
    }

    void c()
    {
    }

    void b()
    {
    }
} 

Теперь, если пользователь A изменит метод "c ()", чтобы он действительно что-то сделал:

    void c()
    {
        System.out.println("Function c is called");
    }

И пользователь B видит, что функции должны быть упорядочены по-разному, и перемещает «c ()» в «b ()»:

public class Foo
{
    void a()
    {
    }

    void b()
    {
    }

    void c()
    {
    }
}

Теперь, если они оба перейдут в централизованное хранилище, я хочу, чтобы результат был:

public class Foo
{
    void a()
    {
    }

    void b()
    {
    }

    void c()
    {
        System.out.println("Function c is called");
    }
} 

Теперь происходит конфликт, и либо пользователь A, либо пользователь B должны решить проблему вручную. По моему мнению, это должно быть обработано автоматически или должно отображаться каким-либо образом. Ручное разрешение не является проблемой, если файл «не такой большой», но файл, содержащий более 800 строк, не так ясен.

Теперь я протестировал git и mercurial, и оба не могут решить это так, как я хочу. Я использовал Subversion раньше и знаю, что это не обрабатывается и у меня есть некоторые недостатки для моего использования, поэтому я предпочитаю DVCS.

EDIT: Чего я (в основном) пытаюсь добиться, так это сохранить историю функции. Я знаю, что Git, например, может показать историю определенных строк. Однако, если функция перемещается, можно легко спутать движение как источник функции. DVCS должно обнаружить это движение, так как оно должно знать историю, например, движение файла. Однажды Линус сказал, что нужно (в случае движения) только перемещать, а не изменять файл, чтобы Git мог «видеть» это движение. Я подумал, что Git может точно так же отслеживать движения кусков.

1 Ответ

3 голосов
/ 01 апреля 2012

Как уже сказал Марк, это не проблема SCM как таковой, а используемый в нем инструмент Merge-Compare, который (более или менее) ориентирован на diff-стиль (т.е. работает с строками )., а не логический блок кода )

Я ничего не могу сказать о упомянутом в (Linux) инструменте сравнения, который распознает перемещение блоков BeyondCompare, но в мире Windows CompareIT!отлично обнаруживает (и показывает) перемещенные блоки строк (и, до некоторой степени - перемещается и слегка изменяется внутри).Но:

  • Сравните!стоит (немного) денег
  • Не обновляется долгое время (с ноября 2010 г.)
  • Не может работать при трехстороннем объединении (только для двухслойного сравнения)

Я также слышал некоторые слухи , что Conflict Solver в SmartSVN Professional также способен обнаруживать перемещенные блоки кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...