Цитата(scifi @ Dec 9 2008, 09:09)
Ув. bialix, спасибо за разъяснения. Более конкретный вопрос:
Предположим, я хочу использовать систему контроля версий для работы с "двоичными" файлами (например, AutoCAD, P-CAD и прочие CADы). Я хочу иметь возможность более-менее свободно переименовывать файлы и директории в хранилище, при этом не увеличивая размер хранилища. Простой тест с Hg (хранилище из 1 файла, чистая история) показал, что при переименовании файла размер хранилища увеличился в 2 раза. Страшно себе представить, что будет, если переименовать директорию на 300 Мбайт. Такая же операция в SVN не увеличила существенно размер хранилища (cheap copy). По слухам, BZR тоже должен не ударить в грязь лицом. Правильный ли я делаю вывод, что при таком сценарии использования BZR выигрывает у Hg по экономии дискового пространства?
Да, правильный вывод. Hg делает переименование как две операции: copy+delete, поэтому после переименования история дублируется (как результат операции copy). Хотя это обещают исправить, так что может быть в ближайшие 6-12 месяцев этьот недостаток действительно устранят.
Базар отслеживает файлы по уникальным идентификаторам (грубо: аналог inode в линуксовой файловой системе). Поэтому при переименовании файла идентификатор и его история не меняется, меняется только текущее имя файла. Всё.
Цитата(yes @ Dec 8 2008, 20:40)
имхо, такая система должна быть простая как гвоздь. если дебри возникают, то что-то неправильно
К сожалению, просто переносить свой опыт из CVS/SVN напрямую в Базар нельзя. Потому что у них разная внутренняя модель, тот базовый стержень вокруг которого все крутится. Я говорю не о технической реализации репозитория, а именно о наборе базовых идей, на основе которых построена вся реализация Базара. У Гита своя модель, у Меркуриала своя. Где-то они имеют общие точки соприкосновения, где-то нет.
Вот например команда pull.
В SVN такой команды нет, ближайший аналог svn update, в результате рабочая копия будет обновлена.
В Hg эта команда просто копирует ревизии из одного репозитория в другой и не обновляет рабочую копию. После pull обычно надо сделать или update или merge.
В Git команда pull -- это на самом деле 2 разные команды, выполняемые паравозиком: fetch (копирует ревизии из одного репозитория в другой) и затем merge или rebase в зависимости от ключика командной строки. Если две ветки разошлись, то они будут объединены.
В Bzr pull копирует новые ревизии, но только в том случае если ветки не разошлись, т.е. локальная ветка является родителем для другой ветки, и все новые ревизии спокойно ложатся как продолжение истории (без merge). Это соответствует fast-forward merge в терминах Git.
Видите? Простой термин, pull в переводе на русский -- это "вытянуть", "вытащить", "высосать" -- а во всех 3 системах она работает чуточку по разному. Да?
Плюс еще путаница в терминологии.
В hg и git репозиторий -- это главное понятие, а ветка она как бы виртуальная внутри репозитория.
В bzr существуют 3 отдельных понятия: репозиторий как хранилище ревизий; ветка, как конкретная история проекта; рабочая копия, как собственно файлы, с которыми вы работаете. Причем они могут присутствовать все одновременно, или некоторые части могут отсутствовать.
Цитата
и какие дебри - я хочу выделить базовый (минимальный) набор команд, которыми пользоваться
Это зависит от желаемого сценария работы. Вы хотите svn-like с checkout?
Цитата
1) сделать diff с одной ветки patch на другую (cvs/svn фунции) - это вроде работает
А зачем diff+patch? Для этого есть merge.
Цитата
2) поддержание нескольких синхронных репозитариев с минимальным геммороем при слиянии, при этом, какой из них главный - не важно и может меняться со временем
Я не понимаю этой фразы. Минимальный геморрой при объединении как бы гарантирует любая распределенная система, потому что merge -- это одна из базовых команд.
Цитата
да вроде бы заработало. меня cygwin и vi, которые ставит win-git не пугают как-то
я понимаю, что есть люди, которые от vi могут офигеть и нужно было бы другой редактор под винду ставить
ну и нету интеграции в эксплорер - мне это нафиг и не надо (а вот CRLF трансляция - очень в тему)
какой-то графический вьювер "репозитария" есть (git-gui)
какие проблемы от git-а под виндой нужно ожидать? (это не риторический вопрос)
Проблемы с русскими буквами в комментариям к фиксациям + проблемы с русскими именами файлов. Совсем недавно ставил msysgit и в очередной раз понял, что моим требованиям он не удовлетворяет.
Цитата
ну откуда история возьмется - я пару дней ковыряюсь между делом
закачал пару сотен файлов, средний размер 10к
один текстовый файл курочу и сливаю (изображая бурную деятельность над ветками проекта)
то же залил в git и hg, но пока не сливал/курочил
с секундомером не мерил - субъективное впечатление, но могу time для unix-а пустить
Вы ставили bzr из готового пакета? У bzr объективно время старта долгое 100-200 мс, частично из-за того, что система на питоне писана. Так что объективные цифры (time) был бы интересен. Хотя объективно и субъективно все равно он будет чуток медленнее git и hg.
Цитата
QBzr - спасибо, фиг бы догадался
Под Линукс с Gnome возможно будет интереснее использовать плагин bzr-gtk.
Цитата
его только как команду, типа bzr qbrowse пускать или есть какой-то другой путь?
Пока только как команды: qbrowse, qlog, qcommit, qdiff и проч.
Цитата
но позволю проявить назойливость
повторять туториал с сайта - нет смысла
обяснять функции VCS c единым репазитарием, тоже не надо, cvs-ом пользовался лет ~10, svn вроде бы без принципиальных вопросов - пол-года
Еще раз повторюсь. Переносить напрямую свой опыт из CVS/SVN в распределенные системы (любые!) -- будет огромной ошибкой. Не считайте себя супер спецом только потому что вы уже 10 лет работали с CVS. Некоторые вещи придется переучивать и ломать стереотипы.
Цитата
внутренности системы - мне тоже не очень интересны, хотя если без этого не понять - буду благодарен за объяснения
Идеей фикс разрабов bzr была мысль, что для понимания принципов работы с bzr не нужно знать как система устроена внутри. Но я могу и рассказать.
Цитата
собственно интересно - зачем нужны push и pull
Для того, чтобы обмениваться историей между двумя ветками, которые имеют общую историю.
Цитата
как я понял (и сумел осуществить) для синхронизации репозитозитариев (вернее веток - по терминологии доки, хотя ветки могут жить и в одном репозитарии)
достаточно update-commit-merge
Для централизованного стиля работы:
есть "главная" ветка на условном сервере. по терминологии она зовется master branch
Чтобы начать работу локально:
bzr checkout URL
Будет создана локальная рабочая копия с историей, "привязанная" к серверу (bound branch)
Поработали. status, diff, commit
При commit новая ревизия автоматом уходит в главную ветку и в локальную ветку, обе ветки таким образом засинхронизированы.
Если кто-то другой (ваш коллега по работе) уже успел сделать commit в главную ветку до вас, то вам нужно синхронизировать локальную ветку с главной. Для этого используется команда update.
После update вы можете делать commit.
Собственно базовый набор команд. Радикально не отличается от svn, и даже push/pull в таком сценарии обычно не используется. Push/pull -- это прежде всего для синхронизации двух независимых веток.
Цитата
ну а если я скопирую средствами ОС - то есть просто скопирую .bzr
какая разница?
Разница небольшая, но она есть. Но в принципе копирование средствами ОС -- это вполне легальная операция.
Цитата
я так понял, что bzr branch аналог svn copy или cvs tag -b
Приблизительно, да.
Цитата
то есть противоречие с предыдущей цитатой - push/pull не просто копируют ветки, а должны использовать слияние (а merge в свою очередь использует update чтобы конфликты поубирать)
ну так история в destination затирается или нет?
Нет, нет и нет.
Цитата
я сумел обойтись update/commit/merge для синхронизации нескольких репозитариев - что я делал не так?
Если у вас централизованная схема работы -- все так, смотри выше.