Существует ли система контроля версий, которая может отображать изменения в конкретном методе или функции? [закрыто]

11

Иногда было бы неплохо иметь возможность сказать что-то вроде:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

чтобы увидеть изменения, внесенные в конкретную функцию в исходном файле с момента последней фиксации, или полную историю изменений. У меня вопрос двоякий:

  1. Существует ли что-то, что делает это?
  2. Будет ли такой инструмент практичным? При каждой ревизии нужно было бы выполнить простой анализ кода, чтобы сравнить разные версии функции; будет ли накладные расходы слишком большими, чтобы они были эффективными?
jches
источник
7
Необходимость в этом, похоже, является признаком основной проблемы, например, методы слишком велики или классы не организованы должным образом, так как любая VCS стоит того, чтобы ее получить, даст вам различие в классе, и достаточно просто прокрутить вниз (или поиск) рассматриваемого метода, если класс не слишком большой, и вы видите код в методе в контексте всего класса. Короче говоря, я думаю, что метод разрешения слишком конкретен.
Роберт Харви
@ Роберт, это хороший момент, и я думаю, что моя мотивация к размышлениям отчасти обусловлена, по крайней мере, небольшим раздуванием кода. Я отследил ошибку в конкретном методе и хочу иметь возможность просмотреть журнал изменений только этого метода, чтобы увидеть, где он сломался, и полные различия могут быть немного неудобными для поиска, если вы спешите :)
jches
4
В очень редком случае, когда это полезно, функция Blame в TortoiseXXX довольно мощная. Вы можете видеть, когда были сделаны последние изменения во всех строках метода, и, используя правое поле, продолжать выполнять эти изменения.
фунтовые

Ответы:

14
  1. Насколько я знаю, это не так. Можно, но я бы не ожидал, что это будет качество продукции, если это произойдет.
  2. Я не думаю, что это практично, но не по той причине, которую вы перечислили. Это не практично, потому что VCS должен был бы знать язык, чтобы поддерживать такую ​​функциональность. По сути, вам нужно было бы встроить что-то для синтаксического анализа текста языка (один из больших шагов, которые делает компилятор). Это добавляет много лишнего веса вашему VCS, который уже выполняет довольно сложную работу.
    Но что более важно, вам нужно будет делать то же самое для каждого языка, который вы хотите поддерживать. VCS, продающий точку, работающую только на C-коде, не получит большой тяги. Даже если вы игнорируете все малопонятные языки, было бы огромным обязательством поддерживать даже 10 лучших языков.

И, как указал Роберт, возможность сразу перейти к методу не является огромным преимуществом по сравнению с необходимостью вручную перейти к методу в инструменте сравнения.

unholysampler
источник
4
Я второй пункт языковой зависимости и много избыточного кода
Чандер Шивдасани
1
Тот же аргумент может быть сделан против редакторов с подсветкой кода; они должны знать язык и действительно существуют. Может быть, выигрыш немного выше (красочные экраны кодеков!). Я согласен, что разбор, вероятно, будет самой сложной частью. Хотя не так сложно поддерживать самые распространенные языки, тем более что вам не нужно полностью разбирать программу.
jches
8

SVN на самом деле делает что-то близкое к тому, что вы хотите.

Вы можете использовать команду:

svn diff -x -p program.c 

-x -p Обеспечивает имя функции «C» на верхней части набора изменений. который выглядит так

@@ -97,6 +102,8 @@ int function1(int *x)

Это не фильтрует, но вы можете grep / search, чтобы служить вашей цели тесно.

Я предполагаю, что это только для 'C' (или C / C ++). Тем не менее, я думаю, что если svn будет востребован, он сделает его доступным и для других языков.

Я не совсем согласен с аргументом, что VCS НЕ должен этого делать. В конце концов, мы хотим, чтобы все IDE или редакторы (такие как VIM, EMACS) делали подсветку синтаксиса, которая специфична для каждого языка и поддерживала множество одновременно. Поэтому VCS, будучи инструментом разработчика, также должен поддерживать такую ​​функциональность.

Конечно, благодаря вашему вопросу, что я его обнаружил. Я никогда не использовал это раньше.

Дипан Мехта
источник
1

Не вдаваясь в подробности, ... но вы можете проверить сайт Semantic Designs и ассортимент их продуктов. Они предлагают некоторые инструменты, которые чувствительны к языку , так сказать, в отсутствие лучшего термина.

ладья
источник
-1

Чтобы показать, какая ревизия и автор в последний раз изменили каждую строку файла:

git blame filename
Ghita
источник
1
Верно, но Q запрашивает способ поиска изменений в конкретном методе в файле. Представьте, что в данном файле есть 100 ревизий, и из них вам нужно найти те, которые содержат изменения в конкретной функции.
Калеб
Контроль версий не знает подробностей синтаксиса, а также не заботится о типах файлов.
Гита
-1

ENVY и STORE оба делают это. Интересно, что, как и в случае с Моничелло, о котором упоминал Логан Капальдо, они тоже предназначены для Smalltalk.

stevek_mcc
источник