Учитывать или игнорировать происхождение


При общении разработчиков, использующих Subversion очень часто можно услышать упоминание термина происхождение. Это слово используется для описания отношений между двумя объектами хранилища: если между ними есть связь, тогда говорят, что один объект является предком другого.

Например, предположим, что фиксируется правка 100, в которой содержатся изменения файла foo.c. В этом случае файл foo.c@99 является предком файла foo.c@100. С другой стороны, можно допустить, что в правке 101 вы фиксируете удаление foo.c, а затем в правке 102 добавляете новый файл с таким же именем. В таком случае файлы foo.c@99 и foo.c@102 могут выглядеть так, как будто они имеют друг к другу отношение (у них одинаковый путь), однако на самом деле являются полностью независимыми объектами хранилища. Они не имеют ни общей истории, ни общих «предков».

Мы обращаем на это ваше внимание, для того, чтобы указать на важные отличия между svn diff и svn merge. Первая команда игнорирует происхождение, в то время, как вторая его учитывает. Например, если попросить svn diff сравнить правки 99 и 102 файла foo.c вы увидите построчное сравнение; команда diff слепо сравнивает два пути. А вот если вы попросите svn merge сравнить те же объекты, то Subversion предупредит вас о том, что они не связаны друг с другом и сначала попытается удалить старый файл, а затем добавить новый; вывод команды покажет удаление с последующим добавлением:

D foo.c A foo.c

В большинстве случаев при объединении сравниваются деревья, имеющие родственную связь и по умолчанию svn merge рассчитывает на это. Однако иногда, вам будет нужно, что бы команда merge сравнила два не связанных дерева файлов. Например, у вас может быть два импортированных дерева содержащих исходный код релизов программных проектов от сторонних поставщиков (см. «Vendor branches»). Если попросить svn merge сравнить два эти дерева, вы увидите, что первое дерево будет полностью удалено, а затем будет полностью добавлено второе!

В подобных ситуациях вам нужно, чтобы команда svn merge выполняла сравнение основанное только на пути, без учета любых отношений между файлами и директориями. Добавьте опцию --ignore-ancestry при записи команды объединения, после чего эта команда будет вести себя также как svn diff. (И наоборот, опция --notice-ancestry будет заставлять svn diff вести себя как команда merge.)


[14] В будущем, проект Subversion планирует использоваться (или изобрести) расширенным формат представления различий, который будет передавать изменения в структуре дерева файлов и свойств.

Пред. Уровень выше След.
Использование веток Содержание Типовые примеры использования


Содержание раздела