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

Я делаю рефакторинг моего проекта на С++, содержащего много исходных файлов. Текущая стадия рефакторинга включает объединение двух файлов (например, x.cpp и y.cpp) в более крупный (скажем, xy.cpp) с выбросом какого-либо кода и добавление еще некоторого кода.

Я хотел бы сообщить своей системе управления версиями (Perforce, в моем случае), что полученный файл основан на двух предыдущих файлах, поэтому в будущем, когда я смотрю историю изменений xy.cpp, я также вижу все изменения, сделанные в x.cpp и y.cpp.

Perforce поддерживает переименование файлов, поэтому, если y.cpp не существует, я точно знаю, что делать. Perforce также поддерживает слияние, поэтому, если бы у меня было 2 разных версии xy.cpp, это могло бы создать из него одну версию. Из этого я понимаю, что возможно объединение двух разных файлов (не уверен в этом); однако я просмотрел некоторые документы по Perforce и другим системам управления версиями и не нашел ничего полезного.

Я пытаюсь сделать что-то вообще? Имеет ли оно условное имя (поиск документации по "слиянию" или "присоединению" был неудачным)?

Ответ 1

Я не думаю, что это можно сделать в классическом VCS.
Эти системы управления версиями представлены в двух вариантах (слайд 50+ Получение git Скоттом Чаконом):

  • История на основе треугольника: вы берете один файл и записываете его дельту. В этом случае устройство является файлом, вы не можете связать его историю с другим файлом.

  • История на основе DAG: вы берете один контент и записываете его патчи. В этом случае сам файл может меняться (его можно переименовать/переместить по желанию), и это может быть результатом двух других содержимого (так что это близок к тому, что вы хотите)... но все еще в истории одного файл (содержимое, поступающее из разных ветвей его DAG).

alt text

Ответ 2

Вы можете попробовать интегрироваться с необоснованными слияниями (-i в командной строке). Если я правильно понимаю документацию (и я никогда не использовал ее сам), это приведет к интеграции двух файлов. Затем вам нужно будет разрешить интеграцию, но вы выбираете ее, что приведет к чему-то близкому к файлу, который вы предполагаете.

После этого я предполагаю, что история Perforce покажет интеграцию из несвязанного файла в историю интеграции, позволяющую вам по желанию отслеживать этот файл.

Ответ 3

Легкая часть будет следующей:

p4 edit x.cpp y.cpp
p4 move x.cpp xy.cpp
p4 move y.cpp xy.cpp

Тогда сложная часть становится решением перемещения y.cpp и выполняет ваш рефакторинг. Но это скажет Perforce, что файлы объединены.