Как работают DVCS (DRCS)? - PullRequest
       8

Как работают DVCS (DRCS)?

0 голосов
/ 05 сентября 2008

Я слышал много хорошего о системах DVCS, в частности о базаре. Помимо концепции распределенного репозитория, я вижу два основных преимущества: слияние лучше автоматизировано, а переименование обрабатывается правильно.

Может кто-нибудь указать мне текст, объясняющий, как именно работают улучшения? Как базар узнает, что я переименовал файл? Что если я переименую два файла как часть одного и того же коммита? Что происходит, когда я выполняю рефакторинг, помещая половину содержимого файла в новый файл, переопределяя все отступы и теряя пробелы почти в каждой строке?

Другими словами, я хотел бы услышать от людей, использующих базар (или другой DVCS) в реальной жизни, или от людей, которые знают, как это (они) работают. Действительно ли слияние намного лучше? И как это достигается?


Схожий вопрос, с полезным ответом:

Почему в Mercurial ветвление и слияние легче, чем в Subversion?

Ответы [ 5 ]

3 голосов
/ 05 сентября 2008

DVCS добивается лучшего слияния, отслеживая родительские ревизии слияний. В Subversion, когда вы объединяете одну ветку в другую, вы теряете информацию о том, откуда произошло слияние. В DVCS, таком как Bazaar или Git, «объединенная» ревизия заканчивается двумя родительскими ревизиями.

Переименование обрабатывается по-разному между DVCS. Git, например, вообще не отслеживает переименование, потому что для Линуса это было неважно. Mercurial записывает их как «скопировать старый файл в новый, удалить старый». По словам Марка Шаттлворта , основателя Canonical, Darcs и Bazaar - единственные DVCS, которые правильно обрабатывают переименование файлов.

Как базар узнает, что я переименовал файл?

Переименования определяются пользователем, так же как добавление или удаление файлов. Используйте команду "bzr rename <old> <new>", чтобы пометить файлы или каталоги для переименования. Если вы уже переименовали файл в дереве, вы можете использовать опцию "--after".

Что если я переименую два файла как часть одного и того же коммита?

Затем вы набираете «bzr rename <old> <new>» один раз для каждого файла. Базар не пытается угадать, какие файлы были переименованы.

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

Затем вы набираете «bzr add» для нового файла, поскольку вы его не переименовываете.

2 голосов
/ 16 сентября 2008

Слияние по сути не лучше в DVCS, просто их было бы практически очень трудно использовать, если ветвление / слияние не работало правильно (возможно, svn не реализует ветвление / слияние правильно), потому что вместо проверки вы создаете новую ветку каждый раз, когда начинаете работать над проектом из существующего кода. Я думаю, что некоторые проприетарные, централизованные SCS правильно обрабатывают слияние / ветвление.

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

http://revctrl.org/CategoryMergeAlgorithm

Как минимум hg, bzr и git могут использовать внешние утилиты слияния.

1 голос
/ 22 октября 2008
1 голос
/ 16 сентября 2008

Ниже приводится обсуждение того, как darcs (http://darcs.net) имеет дело с патчами - http://darcs.net/manual/node9.html.

0 голосов
/ 05 сентября 2008

Я не знаком с базаром, но git не отслеживает переименования файлов. Для мерзавца это выглядит как удаление и добавление. Тем не менее, git достаточно умен, чтобы видеть, что содержимое файла уже существует в его хранилище и будет отслеживать его положение в системе. Если вы разделяете файлы или объединяете их, это достаточно умно, чтобы отслеживать сегменты кода (большие двоичные объекты) и хранить эту информацию тоже.

...