Как провести рефакторинг в Visual Studio без потери истории системы управления версиями?

Использование ReSharper для перемещения/переименования исходных файлов в Visual Studio 2010 очень помогает при рефакторинге приложения. Интеграция системы управления версиями Perforce не может справиться с такого рода изменениями, не рассматривая их как несвязанные «удалить отсюда», «добавить сюда», что разрывает цепочку истории. Мои вопросы:

  1. Есть ли способ заставить плагин Perforce делать правильные вещи в первую очередь?
  2. Если нет, то есть ли способ примириться постфактум внешне? (будет ли Perforce каким-либо образом распознавать файлы, которые были перемещены и, возможно, переименованы, а их содержание было ограничено?)
  3. Есть ли другой продукт управления исходным кодом, который прозрачно справляется с этим?

Спасибо!


person jlew    schedule 26.04.2011    source источник
comment
Я не уверен, что понимаю, так как некоторые рефакторинги всегда будут рассматриваться как удаление, а затем добавление типа изменения. Это действительно зависит от того, что вы делаете. Теперь, если Perforce видит простое переименование и т. д. как удаление, а затем добавление, возникает проблема.   -  person Gregory A Beamer    schedule 26.04.2011
comment
Perforce сделает все правильно, если вы, например, выполните перемещение/переименование из командной строки или графического интерфейса Perforce. Нет, если вы сделаете то же самое из VS.   -  person jlew    schedule 27.04.2011


Ответы (10)


Вы можете проверить Git. В нем нет зависаний, связанных с файлами, как в других системах контроля версий, поскольку история изменений не зависит от файла с конкретным именем. Каждая фиксация отличается от предыдущего кода независимо от файлов внутри него.

Для интеграции с Visual Studio вы можете проверить расширения Git. Информацию об интеграции оболочки Explorer см. в разделе TortoiseGit.

person Paul Sasik    schedule 26.04.2011
comment
Интересно... Вы говорите, что Git не имеет представления об истории отдельного файла или что он может каким-то образом сказать, что Dir1\Dir3\foo.cs стал Dir2\Dir4\bar.cs? - person jlew; 27.04.2011
comment
Он рассматривает весь репозиторий как единое целое, поэтому отдельные файлы и даже папки становятся гораздо менее важными. Нельзя сказать, что одно стало другим, просто они другие. Если вы достаточно часто выполняете обновление/фиксацию и push/pull, история в основном сохраняется. - person Paul Sasik; 27.04.2011
comment
Так как же отследить историю определенного класса (например) в прошлое, чтобы найти точку, в которой она сломалась? - person jlew; 27.04.2011
comment
Вы должны просмотреть историю изменений, а также выполнить добавление/удаление файла. Не существует системы ревизий, которая будет выполнять требуемое отслеживание, во всяком случае, пока. Git — это улучшение, но вам все равно нужно быть осторожным с кодовой базой. Кроме того, переименования файлов/классов случаются, но они не должны быть настолько частыми, чтобы это стало вашей главной заботой при выборе версии. система управления. - person Paul Sasik; 27.04.2011
comment
Это неправда, perforce может отслеживать ревизию файла при переименовании и нормально перемещается. Просто убедитесь, что вы используете версию 2009.2 или более позднюю. - person aflat; 27.04.2011
comment
@George: Верно, он отлично работает через собственный клиент, но не когда вы выполняете операцию из Visual Studio. - person jlew; 27.04.2011
comment
В итоге мы перешли на Git, который отлично подходит в этой ситуации. Отслеживание оказывается немного более изощренным, чем Пол указал выше. Если вы перемещаете/переименовываете И изменяете файл в том же коммите, он все равно будет отслеживать его в большинстве случаев (если определенный % файла остается неизменным) - person jlew; 25.07.2012
comment
Переключение на другой vcs не помогает тому, кто использует perforce. - person Andy; 30.09.2013

Это недостаток других систем контроля версий, не только Perforce. TFS страдает от той же проблемы.

  1. Нет, нет пути.
  2. Помимо комментариев в комментариях к регистрации, если вы убедитесь, что фиксация включает только удаление и добавление, вы можете сохранить ссылку там.
  3. Я считаю, что Git это делает. Он также обрабатывает перемещение частей кода между файлами.
person Oded    schedule 26.04.2011
comment
Subversion справляется с этим, я думаю? если вы переименуете, вы все равно сможете увидеть единый унифицированный журнал файла (по крайней мере, я могу с tortoisesvn). для справки, я не голосующий против. - person wal; 27.04.2011
comment
@wal - Тем не менее, он выполняет удаление и добавление. - person Oded; 27.04.2011
comment
который не разрывает цепочку истории? - person wal; 27.04.2011
comment
@wal: Дело здесь в интеграции с VS. Perforce сохранит ссылку на историю, если вы используете p4 move. Но держу пари, что ReSharper, P4SCC или другие инструменты рефакторинга не будут знать достаточно, чтобы вызвать эту команду для переименованных файлов. - person JasonMArcher; 11.05.2011
comment
@Wal / Oded: TortoiseSVN имеет команду fix rename, которую вы можете выполнить перед регистрацией, когда один файл добавлен, а другой отсутствует. - person Schiavini; 15.03.2012
comment
@Schiavini - ОП спрашивает о Perforce, а не о подрывной деятельности. - person Oded; 15.03.2012
comment
Вы правы, но я прокомментировал SVN, так как вы также говорили о Git и TFS. - person Schiavini; 15.03.2012

Новый подключаемый модуль Perforce, P4VS, гораздо лучше справляется с управлением перемещенными/переименованными файлами в Visual Studio. Если вы пробовали только P4SCC и разочаровались, попробуйте P4VS. Я обнаружил, что он делает «правильные» вещи в большинстве случаев, когда P4SCC этого не делал.

person Dan K    schedule 28.11.2012
comment
Спасибо. Мы перешли на Git некоторое время назад (по другим причинам), и он прекрасно решает эту проблему. - person jlew; 29.11.2012

В Perforce 2009.2 и более поздних версиях есть команда перемещения p4. Это не идеально, вы сохраняете историю файлов, но при выборе папки история не отображается в p4v.

person aflat    schedule 26.04.2011
comment
Perforce move/rename выполняет правильную работу при вызове вручную, но мой сценарий имеет дело с пакетными операциями, которые выполняются внутри Visual Studio в результате рефакторинга Resharper. - person jlew; 27.04.2011

Вы можете увидеть полную историю, посмотрев на график изменений файла.

Шаги, которые нужно предпринять: 1) Переименуйте 2) Щелкните правой кнопкой мыши и просмотрите историю файла с новым именем можно увидеть полную историю со ссылкой, где происходит удаление/добавление. 4) Вы можете выбрать узлы на графике и выполнить сравнение, чтобы увидеть изменения между разными файлами.

Это дополнительный шаг и не очень очевидный, но он работает для меня.

person johnB    schedule 06.01.2012

  1. Нет, не то чтобы я в курсе. Попробуйте обратиться в службу поддержки Perforce.

  2. Я бы не пошел таким путем.

  3. На самом деле это не другой продукт системы управления исходным кодом, но вы можете попробовать VS2P4 вместо P4SCC, который, похоже, работает с классом переименования ReSharper. рефакторинг. Я сделал переход некоторое время назад, и он мне очень нравится, хотя у него есть свои особенности. Доступно для установки через VS2010 Extension Manager.

person rjnilsson    schedule 27.04.2011
comment
Хм, VS2P4 выглядит интересно, но я не могу найти его через NuGet - person jlew; 27.04.2011
comment
@jlew: Извините, мой плохой. Используйте диспетчер расширений из VS2010 (находится в меню «Инструменты»). - person rjnilsson; 28.04.2011
comment
Пробовал, выглядело многообещающе, но мое большое решение (более 70 проектов) зависает при загрузке. - person jlew; 28.04.2011
comment
@jlew: Что ж, попытаться стоило. Я бы порекомендовал вам оставить отчет об ошибке на codeplex. - person rjnilsson; 29.04.2011

Вот запутанное решение, если вам действительно нужно сохранить эту информацию:

  1. Создайте клон Mercurial хранилища Perforce (или его подраздела), используя расширение Perfarce.
  2. Установите подключаемый модуль VisualHg SCC, который является интеграцией Mercurial в VS.
  3. Сделайте свой рефакторинг - VisualHg, я думаю, правильно справляется с переименованиями. Это, безусловно, происходит в случае ручного переименования файла из Visual Studio, поэтому я предполагаю, что Resharper тоже будет работать.
  4. Отправьте изменения из Mercurial обратно в Perforce. Это должно включать в себя правильные операции ветвления и удаления (перемещения), которые вам нужны.

Примечание. Я не пробовал это, так как у меня нет Resharper, но ссылка Perforce->Mercurial->Perforce хорошо работает с Perfarce, а VisualHg значительно превосходит другие подключаемые модули SCC, которые я использовал. Так что, возможно, стоит попробовать. Вы, вероятно, могли бы сначала быстро удалить ссылку Resharper/VisualHg, и если все пойдет хорошо, выполните шаг Perforce-> Mercurial.

person Greg Whitfield    schedule 02.05.2011

Я попробовал VS2P4 с контекстной справкой ReSharper «Переименовать файл в соответствии с именем типа». И...

это не работает. Он показывает диалог

введите здесь описание изображения

и если я нажму «Продолжить с изменением», это действительно сделает то, что сказано в предупреждении. Он удаляет и добавляет файлы, не сообщая об этом Perforce. Извлекается только файл проекта.

person brgerner    schedule 10.02.2012

FWIW, версия 1.74 VS2P4, выпущенная сегодня, имеет значительные улучшения производительности, особенно для решений с тысячами файлов.

person Dale Brubaker    schedule 15.03.2012

VS макрос

Я написал макрос для добавления действия "p4 move -k" к событию Rename Visual Sudio. См. ответ на вопрос "Как сохранить историю изменений при переименовании файлов в Visual Studio с помощью Perforce".

С помощью этого макроса вы можете сделать по крайней мере правильное переименование файла в Visual Studio.
Я думаю, что невозможно правильно переименовать класс и файл сразу (как это делает, например, ReSharper), потому что переименование и изменение файла в одном списке изменений невозможно в Перфорсе.

person brgerner    schedule 25.07.2012