Персональные инструменты
 

Линус Торвальдс о GIT на Google Talk — различия между версиями

Материал из CustisWiki

Перейти к: навигация, поиск
м (#REDIRECT)
 
Строка 1: Строка 1:
[[Image:Linus-git-googletalk.0-00-04.098.jpg|right]]
+
#REDIRECT [[Линус Торвальдс о GIT на Google Talks]]
 
+
<blockquote>
+
Перевод доклада Линуса Торвальдса о системе контроля версий <tt>git</tt> на «''Google Talk''»
+
<ref>Оригинальное видео доклада http://www.youtube.com/watch?v=4XpnKHJAok8</ref>,
+
выполнен сообществом компании [http://team.custis.ru «Заказные ИнформСистемы»].
+
</blockquote>
+
 
+
<blockquote>
+
Есть предложение удалить эту статью, т.к. уже есть точно такая же: [[Линус Торвальдс о GIT на Google Talks]].
+
</blockquote>
+
 
+
[[Image:Linus-git-googletalk.0-00-11.269.jpg|center]]
+
[[Категория:Системы контроля версий]]
+
 
+
== Представление ==
+
 
+
[[Image:Linus-git-googletalk.0-00-19.731.jpg|framed|right| Эндрю Мортон. Один из ведущих разработчиков ядра Linux. Работник Google]]
+
 
+
'''''Эндрю:'''''
+
Спасибо всем пришедшим, большинство из вас вероятно уже слышали
+
о Линусе Торвальдсе, а те, которые не слышали — это люди с Макинтошами на коленях.
+
Это парень, который прется от издевательств над людьми.
+
Его последняя выходка — создание СУВ<ref>система управления версиями</ref>, которая явно создана для того,
+
чтобы вы почувствовали себя менее умными, чем до знакомства с ней.
+
Спасибо, что снизошли до нас сегодня, Линус.
+
Последние дни я получал письма от людей, вопрошающих:
+
«Где Линус? Почему он не берет мою ветку? Он меня больше не любит… =(»
+
 
+
 
+
 
+
<!-- [[Image:Linus-git-googletalk.0-00-35.640.jpg|framed|center]] -->
+
И вот, он пришел в мой офис сегодня днем, и сказал: «а чем ты вообще тут занимаешься?!»
+
О, спасибо вам, что тратите на нас свое время.
+
И вот, Линус пришел сегодня, чтобы объяснить нам,
+
какого …, он написал такие тулы, гм,
+
что только он тот избранный, кто настолько мудр, чтобы понять, как ими пользоваться.
+
 
+
[[Изображение:linus-git-googletalk.0-00-51.199.jpg|framed|center| тут все апплодируют, апплодируют…]]
+
 
+
== Вводное слово ==
+
[[Изображение:linus-git-googletalk.0-01-15.165.jpg|framed|left|Линус Торвальдс.]]
+
 
+
'''''Линус:'''''
+
 
+
Ну, я должен слегка предостеречь вас, что я не очень хороший оратор,
+
частично потому, что я не люблю выступать, а частично потому,
+
что за последние несколько лет все только и хотели от меня докладов
+
о туманном будущем Линукса в следующем столетии,
+
а я вообще гик и предпочитаю говорить о технологиях.
+
 
+
Так вот, я не буду говорить про ''Ядро''<ref>Проект Linux Kernel.</ref>, просто потому, что оно слишком большое,
+
чтобы рассказать о нем за час, хотя похоже Эндрю сделал это пару дней назад.
+
Вместо этого я расскажу вам про [[EnPedia:Git_(software)|git]], систему управления версиями,
+
которую мы используем для Ядра.
+
 
+
Я очень-очень-очень плохо делаю слайды, поэтому,
+
если я буду строго им следовать, то к концу вы все умрете от тоски.
+
Видимо, в любом случае доклад сильно удачным не будет,
+
но я из тех докладчиков, которые действительно рады отвечать на вопросы.
+
В общем, если мы будем местами отклоняться от плана доклада,
+
то всем нам будет лучше, вероятно и разговор у нас получится более интересный.
+
 
+
<!-- [[Изображение:linus-git-googletalk.0-01-10.219.jpg|framed|right]] -->
+
Я не знаю, как тут у вас, на ''Google talks'', все это происходит,
+
я скажу просто — меня не стесняйтесь.
+
А если ваш начальник потом вас пристрелит — это будет уже ваша проблема.
+
 
+
== Credits ==
+
 
+
[[Изображение:Linus-git-googletalk.0-02-21.683.jpg|framed|Потому что Линус любит заставлять людей думать, что он скромный|left]]
+
Сначала я хочу раздать несколько отзывов и благодарностей.
+
 
+
О [[CVS]] я будут отзываться только в очень-очень отрицательном ключе,
+
потому что я, когда проектировал <tt>git</tt>, во многих ситуациях
+
использовал (в контексте СУВ) подход «что бы тут сделал Иисус», а иногда и «что бы тут CVS никогда не сделала».
+
 
+
Я никогда не использовал CVS при разработке ядра.
+
За последние десять лет для поддержки ядра
+
мы использовали только тарболы<ref>tarballs — несжатые tar-архивы</ref>
+
и патчи<ref>patch — файлы изменений</ref>,
+
которые оказались лучшими СУВ, чем CVS,
+
но я «покончил с CVS» после семилетнего опыта использования ее
+
в коммерческой компании, и я страстно ненавижу эту систему.
+
 
+
Когда я сказал, что страстно ненавижу CVS, я должен также сказать, что если в аудитории есть пользователи SVN ([[EnPedia:Subversion (software)|Subversion]]),
+
то вы, возможно, захотите уйти.
+
Поскольку моя ненависть к CVS означает, что я считаю Subversion самым
+
бесцельным проектом, так как основной девиз Subversion некоторое время был
+
«Сделанный по-уму CVS» или что-то вроде этого.
+
А если вы начинаете с такого слогана, то вы никуда не сможете прийти.
+
Это так, потому что CVS невозможно сделать «правильным».
+
 
+
Это была негативная часть.
+
 
+
А вот с благодарностью я упомяну о [[EnPedia:BitKeeper|BitKeeper]],
+
хотя я понимаю, что по мнению многих, вокруг ''BitKeeper''’а было
+
много проблем и споров да и «развод» с ним был во многих смыслах неприятен.
+
Но по-моему, наш развод с BitKeeper-ом был
+
вполне полюбовный, хотя снаружи это казалось иначе.
+
И BitKeeper не только стал первой системой контроля версий,
+
которая показалась мне вполне достойной,
+
но, более того, показал мне, в чем была его основная идея
+
и как с ней можно реально работать.
+
И хотя <tt>git</tt> во многом, в том числе технически, очень-очень сильно отличается от
+
BitKeeper (это было специально задумано, чтобы убедить всех, что это
+
не клон BitKeeper), многие процессы используемые нами с <tt>git</tt>,
+
взяты из BitKeeper.
+
 
+
Кстати, вы используете BitKeeper здесь, в Google? Я сомневаюсь.
+
Насколько я знаю, BitKeeper — это единственная коммерческая распределенная СУВ,
+
и поэтому, если вам-таки нужна именно коммерческая система,
+
то вам стоит использовать BitKeeper.
+
 
+
Я также хотел бы заметить, что я разрабатываю <tt>git</tt> чуть больше двух лет,
+
но хотя я запустил проект, разработал архитектуру и начальный код,
+
на протяжении последних полутора лет его поддерживает
+
гораздо более славный парень, японец ''Junio Hamano'',
+
и именно он сделал <tt>git</tt> более доступным для простых смертных.
+
Ранние версии <tt>git</tt> действительно требовали некоторое количество
+
«ментальных пунктов» мозгосилы.
+
C тех пор он стал гораздо проще.
+
 
+
В общем, это мой обычный подход —
+
все остальные делают все возможное, а я сам могу просто сидеть и потягивать
+
ПинаКоладу<ref>Пинья колада (исп. Piña colada), также ошибочно называемый пинаколада/пиноколада и т. п. — традиционный карибский алкогольный коктейль содержащий ром, кокосовое молоко и ананасовый сок.</ref>,
+
ну и типа люди то же вроде как-то при деле…
+
 
+
На этом благодарности окончены, всех вышеперечисленных откладываем в сторону.
+
 
+
== Content ==
+
 
+
[[Изображение:linus-git-googletalk.0-06-23.653.jpg|framed|right| Он набросал эту презентацию прошлой ночью, не ждите здесь чуда]]
+
Вот этому слайду уже один день.
+
Я вообще не делал презентацию прошлой ночью, потому что прошлой ночью
+
я пьянствовал, отрывался и ел суши. Вот.
+
 
+
И тем не менее, в презентации
+
речь пойдет о реализации надежной, высокопроизводительной распределенной
+
системы управления содержимым, и ключевое слово здесь — «распределенная».
+
Я сначала попытаюсь объяснить, почему распределенность так важна.
+
Если мы потом к этой теме не вернемся, я буду действительно счастлив.
+
 
+
И ничего страшного, если мы так и не разберем, как <tt>git</tt> устроен изнутри.
+
Учить пользоваться <tt>git</tt>’ом я тоже не буду.
+
Ну есть же у вас такая штука, которую вы делаете, «google.com»,
+
и в ней есть такое место, куда можно вводить буквы, и если вы введете туда «git»
+
и нажмете кнопку «Мне повезет!», вы обязательно попадете [http://git-scm.com/ на официальный сайт <tt>git</tt>],
+
на котором есть и вводные обучающие курсы и руководство пользователя в HTML-формате.
+
В общем, если вы хотите научиться пользоваться <tt>git</tt>, вам нужно первым делом туда,
+
а не на этот доклад.
+
 
+
Но, как я уже сказал, ничего страшного, если мы отклонимся в сторону от темы
+
из-за ваших вопросов.
+
 
+
== Content Advisory ==
+
[[Изображение:Linus-git-googletalk.0-08-05.443.jpg|framed|left|Линус критичен и к программам и к людям]]
+
 
+
Я вам уже озвучил эти примечания к заголовкам; я использую сокращение [[EnPedia:Source_Code_Management|SCM]] в
+
значении «''source code management''/управление исходным кодом»,
+
что то же самое, что контроль версий. Некоторые думают, что SCM означает
+
«Управление конфигурациями/''software configuration management''»
+
и включают сюда не только контроль версий, но и управление релизами и все такое;
+
но я сейчас буду рассказывать не об этом, хотя <tt>git</tt> вполне подходит и для этого.
+
 
+
С [[CVS]] мы уже разобрались. Вы можете не соглашаться со мной сколько хотите, но в течение этого доклада
+
все, кто не согласен со мной, по определению — тупые уроды.
+
Помните об этом!
+
Вы будете вольны делать и думать все что захотите, когда я закончу доклад.
+
А сейчас я рассказываю свое единственно правильное мнение,
+
так что пользователи CVS, если вы действительно его так любите,
+
уйдите с глаз моих долой. Вам надо обратиться в психушку или куда-то еще.
+
 
+
== Background ==
+
[[Изображение:Linus-git-googletalk.0-09-24.327.jpg|framed|right|от BitKeeper к <tt>git</tt>]]
+
 
+
Теперь, перед тем как начать говорить о самой сути «Распределенности»,
+
что, по-моему, архиважно, нельзя не упомянуть об истории <tt>git</tt>,
+
потому что если люди что-то и слышали о <tt>git</tt>,
+
то это, в первую очередь, историю его возникновения.
+
 
+
Во-первых, я на самом деле вообще не фанат SCM.
+
Я никогда особо не интересовался системами контроля версий, и думал, что это зло,
+
пока не наткнулся на ''BitKeeper'', который оценил по достоинству; и,
+
в некотором смысле, именно поэтому <tt>git</tt> намного лучше всего остального,
+
ведь мой мозг не страдал долгие годы, думая, что [[CVS]] делает что-либо разумное.
+
 
+
Мне понадобилась замена для BitKeeper.
+
Причина в том, что BitKeeper — это коммерческий продукт,
+
но ''BitMover'' и ''Larry McVoy'' разрешили использовать его бесплатно для open-source
+
продуктов, как вы, возможно, знаете; единственным ограничением было то,
+
что его нельзя было исследовать (''reverse engineer'') и нельзя пытаться создать конкурирующий продукт.
+
 
+
И я был вполне этим доволен, ведь я делаю свободное ПО,
+
потому что считаю это единственным правильным способом разработки,
+
но я также хочу использовать лучшие инструменты для работы,
+
и BitKeeper был как раз таким.
+
 
+
Но не все были согласны со мной.
+
Все они тупые уроды, но как бы там ни было,
+
они подкинули проблем,
+
и это в результате привело к тому, что мы с ''Larry'' несколько раз
+
поговорили по телефону и в конце концов договорились прервать сотрудничество,
+
дабы не ухудшать отношения.
+
 
+
Тогда, примерно 2 года назад, я выпустил релиз <tt>Linux 2.6.12-rc2</tt> и сказал,
+
что не продолжу разработку Linux, пока у меня не будет замены BitKeeper’у,
+
для управления исходным кодом.
+
 
+
Одним из способов замены был возврат к tar-архивам и патчам,
+
но все были категорически против.
+
 
+
Поэтому я рассмотрел кучу альтернатив.
+
Большинство из них я отбросил, даже не попробовав.
+
 
+
Если система не распределенная, ее не стоит использовать, это же очевидно.
+
 
+
Если у системы проблемы с производительностью,
+
ее тоже не стоит использовать, это так же очевидно.
+
И наконец, если вы не можете быть уверенными в том, что то, что вы положите в SCM,
+
можно легко достать обратно в том же виде,
+
такую систему тоже лучше не использовать.
+
 
+
Честно говоря, та малышка [BitKeeper] прекрасно заботилась обо всем.
+
Полно СУВ которые не гарантируют, что то, что вы из них достаете,
+
является в точности тем, что в них положили.
+
Вы можете никогда и не узнать, что у вас повреждена память или жесткий диск.
+
А заметите это, только когда получите назад поврежденный файл.
+
Причем сама система контроля версий за этим вообще не следит.
+
И такое — совсем не редкость.
+
Да, это встречается очень, очень часто.
+
 
+
Проблема быстродействия: одной из систем, которая мне более-менее понравились,
+
была система [[EnPedia:Monotone_(software)|Monotone]], о которой, кстати, когда-то вроде был доклад в Google,
+
хотя может я и ошибаюсь; так вот, в ней было много интересных идей,
+
но производительность была просто ужасна,
+
так что попробовав ее один день, я понял, что она мне не подходит.
+
 
+
В результате, я решил, что сам за две недели смогу написать что-то получше,
+
и не ошибся.
+
 
+
== Distribution ==
+
 
+
[''Показывает слайд «Distribution» с картинкой'']
+
 
+
[[Image:Linus-git-googletalk-slide-distribution.jpg|framed|Это не просто хорошая идея. По-другому просто не будет работать!]]
+
 
+
Теперь перейдем к ''Распределенности'', и это худший слайд из всех,
+
и мне стыдно за него, но проблема в том, что ''Распределенность''
+
действительно очень важна,
+
но у меня никогда не получается сделать об этом нормальный слайд.
+
Частично это из-за моих скудных художественных способностей,
+
которые вы видите перед собой на экране,
+
но на самом деле это действительно трудно объяснить.
+
 
+
Поэтому прежде чем я начну, я хотел бы знать,
+
кто из вас привык к идее по-настоящему распределенной системы контроля версий?
+
 
+
[''слушатели поднимают руки'']
+
 
+
Большинство из вас разрабатывают ядро?
+
Нет?
+
Хорошо, примерно десять человек подняли руки.
+
 
+
Распределенность главным образом означает отсутствие центрального места,
+
в котором хранятся ваши данные и отслеживаются изменения.
+
Ни одно хранилище не является более важным, чем какое-либо другое.
+
 
+
Поэтому, например, я Subversion даже
+
трехметровым багром трогать не буду.
+
В Subversion большой репозиторий, куда все обязаны складывать свои данные.
+
А централизованная модель просто не работает,
+
когда… давайте взглянем на некоторые такие случаи.
+
 
+
[''Показывает слайд «Distribution» с пунктами'']
+
 
+
[[Image:Linus-git-googletalk-slide-distribution2.jpg|frame|Слайд «Distribution» с пунктами]]
+
 
+
Я сказал, что распределенность — это гораздо больше, чем просто работа в оффлайн,
+
но это, пожалуй, понять проще всего:
+
вы можете взять по-настоящему распределенную SCM с собой в самолет и,
+
даже если в нем нет ни wi-fi, ни спутникового интернета,
+
вы просто продолжаете работать — вы можете посмотреть любые логи,
+
вы можете фиксировать изменения, вы можете делать все, что вы бы делали,
+
если бы вы были подключены прямо к магистральному каналу с гигабитным Ethernet.
+
И это действительно важно.
+
 
+
Это вдвойне важно, когда над одним и тем же проектом работают
+
сотни и тысячи людей, и они даже не обязательно должны быть все отключены
+
от сети, просто на практике они на самом деле не всегда имеют хорошую связь.
+
Так что работа в оффлайн — это один из аспектов распределенности,
+
и даже если работа не всегда идет оффлайн,
+
очень важно иметь возможность делать все, что вам нужно,
+
находясь в любом месте и даже не имея возможности подключиться к серверу.
+
 
+
Этот простой факт приводит к появлению гораздо большего количества веток,
+
потому что каждый, у кого есть целиком весь репозиторий и возможность в него
+
коммитить, будет работать в своей собственной ветке, даже этого не осознавая.
+
Да-да, даже если вы считаете, что ваш проект имеет только одну ветвь, каждый раз,
+
когда вы отключаетесь от сети и начинаете работать над проектом,
+
вы работаете со своей отдельной веткой.
+
 
+
И это действительно очень важно и очень сильно отличается от работы в CVS,
+
где ветвление считается уделом настоящих мастеров.
+
 
+
Кто из вас когда-либо пользовался CVS?
+
 
+
[''Слушатели поднимают руки'']
+
 
+
Понятно, все. А кто когда-нибудь по-настоящему создавал ветку, а потом объединял изменения в CVS?
+
 
+
[''Слушатели поднимают руки'']
+
 
+
Хорошо.
+
Отмечу, что далеко не все, хотя и гораздо больше, чем я ожидал.
+
 
+
Ну и кому из вас понравилось осуществлять этот процесс?
+
 
+
[''смех'']
+
 
+
Понятно, все-таки нескольким понравилось.
+
 
+
Считается, что это сложная операция. В CVS, когда вы объединяете ветки (а я делал это, избегал как мог, но приходилось),
+
вы планируете это на неделю вперед и, как правило, оставляете на это целый день.
+
 
+
Разве я не прав?
+
Что-то я не вижу, чтобы многие говорили «Нет, это очень просто, мне нравится это делать».
+
Это отвратительно!
+
+
Обязательно нужно понять, что в распределенной системе каждый человек работает
+
со своей отдельной веткой.
+
И это не страшно, вам даже не надо что-то специально настраивать,
+
так устроено изначально.
+
 
+
На самом деле, в <tt>git</tt> мы так любим ветки, что многие держат их по 10-15 штук,
+
потому что когда вы понимаете, что у вас по-любому будет отдельная ветка,
+
вам уже все равно, сколько их будет, и вы делаете отдельные ветки
+
для экспериментов и отдельные для поддержки.
+
Так что ветвление гораздо более свойственно распределенным системам.
+
+
Еще одна вещь, которая мне кажется важной, — это то, что распределенная система
+
в силу своего устройства более надежна.
+
 
+
Мой подход к архивам/бэкапам таков:
+
не делать их специально,
+
а просто публиковать свои данные на сайте,
+
а остальные пусть их копируют/зеркалируют, и мне пофиг,
+
если у меня сломается компьютер, потому что я могу скачать все обратно.
+
И это отлично работает, и при этом мне не нужна служба поддержки.
+
 
+
Я очень сомневаюсь, что все так делают.
+
Но это по-настоящему работает только в распределенных системах.
+
Если вы пользуетесь CVS, вы не можете так сделать, если вы используете…
+
кстати, чем вы здесь пользуетесь?
+
 
+
Perforce?… [[EnPedia:Perforce|Perforce]]. Ну да, извините.
+
Да, он, конечно же, лучше, чем [[CVS]].
+
 
+
[''Слушатели смеются'']
+
 
+
Но все равно это по сути CVS.
+
 
+
Еще одна прикольная вещь, хотя у вас в компании возможно этого и нет,
+
но это обязательно есть во всех командах, разрабатывающих свободное ПО,
+
которые используют CVS или Subversion или что-то вроде этого, это то,
+
что они пользуются понятием «commit access».
+
 
+
Ведь то, что у вас центральный репозиторий, означает, что все,
+
кто работают над проектом, должны складывать данные именно туда.
+
 
+
И что это значит?
+
Поскольку вы не хотите, чтобы все подряд правили данные в центральном
+
репозитории, из-за того, что большинство людей — идиоты, то вам приходится выделять
+
людей, которые, по-видимости, идиотами не являются.
+
И чаше всего в этой группе оказывается слишком мало людей, потому что очень
+
сложно понять, насколько человек шарит, и наоборот,
+
даже если эта группа будет очень мала,
+
проблемы у вас все равно будут.
+
 
+
В общем, эта проблема доступа к коммитам, которую некоторые компании
+
пытаются не замечать, просто давая всем доступ для коммитов, эта
+
проблема создает огромный психологический барьер и в большинстве проектов с
+
открытым кодом приходится тратить бесконечные часы для того, чтобы определиться
+
с политикой коммитов.
+
 
+
Если же у вас распределенная модель, всех этих проблем нет.
+
Доступ к коммитам есть у каждого, вы можете делать что угодно со своим проектом.
+
Вы просто получаете собственную ветвь, и пишете ли вы в ней гениальный код, или
+
какой-нибудь маразм, это никого не волнует, это ваша копия.
+
Это ваша ветвь.
+
 
+
И потом, если окажется, что вы сделали что-то полезное, вы можете сказать
+
людям: «''Эй, тут в моей ветви все работает в десять раз быстрее, чем у всех остальных,
+
так что ня-ня-ня, не хотите взять мой код?''».
+
И народ берет.
+
 
+
Так это и работает и у нас нет никаких правил.
+
Это конечно не совсем так — у нас регулируется другое,
+
но о таких вещах как доступ к коммитам нам беспокоиться не нужно.
+
И я думаю, что это огромный результат и уже только из-за него одного любая
+
система с открытым кодом должна использовать распределенную модель, а не
+
что-либо другое.
+
 
+
Вы избавитесь от кучи проблем.
+
 
+
Одна из них касается коммерческих компаний.
+
Распределенная модель может также помочь с процессом выпуска релизов.
+
У вас может быть команда тестировщиков, которая работает в своем дереве.
+
Они берут код у других, проверяют его и когда проверят, передадут его
+
команде выпуска.
+
И они скажут: «Эй, мы тут проверили новую версию» и разработчики могут
+
продолжать работать головой вместо того, что маяться всякой дурью типа создания
+
меток, ветвей и всего того, что вы обычно делаете, чтобы разработчики не
+
конфликтовали друг с другом, потому что это достигается тем, что каждая группа
+
работает в своем дереве, следит за тем, что она сделала и что хочет сделать.
+
 
+
То есть Распределенность — это на самом деле ключевой момент для любой из
+
СУВ, которые стоит использовать.
+
 
+
Так что немедленно избавьтесь от Perforce!
+
 
+
[''Апплодисменты'']
+
 
+
Да, может и жалко, но это архиверно!
+
 
+
Это был мой единственный слайд о распределенности.
+
Я бы хотел послушать ваши вопросы, потому что затем мы двинемся к другой теме.
+
 
+
'''Из зала:'''
+
 
+
[[Image:Linus-git-googletalk.0-21-39.872.jpg|frame|right|И как вы собираетесь это делать?]]
+
 
+
{{question}} Вопрос. И как вы собираетесь это делать?
+
Если у вас есть эта монстрообразная, страшно огромная база кода
+
и вы хотите использовать ее, не останавливая
+
другие дела на шесть месяцев, как вы собираетесь это делать?
+
 
+
'''Линус:'''
+
 
+
Не отходите от микрофона, потому что я не совсем понял ваш вопрос.
+
Он ушел, ну ладно.
+
 
+
«Как вы собираетесь это делать?» — Ну, вот пример реальной распределенности:
+
у вас есть команда из пяти человек, которые работают над
+
одной небольшой конкретной вещью.
+
 
+
И это означает, что некоторое время это вещь будет сильно-сильно
+
испорчена, так?
+
Потому что никто на самом деле не создает прекрасный код с первого раза, за
+
исключением меня, но я такой один, так?
+
Поэтому им нужно иметь собственное дерево,
+
в котором они могут работать, не мешая остальным.
+
 
+
Вы можете этого достичь множеством способов.
+
В CVS один из наиболее распространенных подходов — не делать коммитов вообще,
+
поскольку возиться с ветвями очень нудно.
+
 
+
То есть вы не делаете коммиты, пока код не пройдет абсолютно все тесты.
+
Или например, в вашей компании строгое политика коммитов:
+
«нельзя делать коммиты пока они не пройдут весь набор тестов»,
+
а между прочим все тесты будут выполняться два часа, жесть!
+
 
+
Да, вам не позволяют делать коммиты.
+
И это происходит почти в каждой компании.
+
Я уверен, что это так даже у вас, в Google.
+
У вас вероятно есть строгий набор тестов и вам нельзя делать коммиты, пока
+
все тесты не будут пройдены, а это приводит к тому, что на практике люди вносят
+
изменения по одной строчке и не тестируют, потому что знают, что изменения в
+
одной строчке скорее всего ничего не сломают.
+
Да, бывает и так.
+
 
+
Такой подход, конечно — ужас-ужас!
+
Это означает, что вы делаете коммит огромного числа изменений за раз,
+
потому что работали над этими изменениями две недели.
+
И в итоге у вас три человека, которые делают одно и то же, потому
+
что они не видят изменений от других, пока не сделают коммит своих.
+
Это часто происходит, это происходит везде, это жуть!
+
 
+
Другой вариант — это использовать ветви, пусть даже в централизованной среде.
+
Но ветви всегда обрываются, так как их слишком дорого поддерживать,
+
так что у вас не получится разрабатывать в них экспериментальную функциональность.
+
Вы никогда заранее не знаете, потребуется ли на что-то один день или две недели,
+
ведь почти всегда любой программист скажет: «Ха, я сделаю это за 48 часов».
+
А потом выясняется, что «не-а, не могу».
+
 
+
Но так как вы думаете, что сможете сделать это за 48 часов, вам очень лень
+
создавать ветвь, даже в таких системах, в которых это делать удобнее, чем в CVS.
+
И вы этого не делаете, потому что думаете, что как-нибудь справитесь с этим
+
и вы возвращаетесь к случаю № 1, но даже если вы решите создать ветвь, то будете
+
менять содержимого репозитория и для всех остальных,
+
потому что в централизованной среде ветви глобальны.
+
 
+
То есть вы столь любезны, что вы трахаетесь со всеми остальными,
+
но при этом не трогаете их ''основной ствол'', так называемую ''головную ветвь''.
+
Вы добавляете что-то новое в их репозитории, но при этом так,
+
чтобы они ничего не заметили (по-крайней мере, вы на это надеетесь).
+
Но общий репозиторий все равно от этого пухнет.
+
 
+
В общем, в любом случае, успеха вы не добьетесь.
+
 
+
В распределенной же среде происходит так: есть пять человек, они берут себе
+
текущую головную ветвь, которая надежна и протестирована и они начинают
+
работать с ней и делать коммиты,
+
и вам не надо ждать две недели, пока ваши изменения не станут стабильными,
+
потому что они всегда локальны.
+
А внутри этой группы из пяти человек, все могут брать
+
изменения друг у друга.
+
 
+
Вот в этом и смысл распределенности — нет центра, а значит, что все
+
равны и что можно проводить слияния друг между другом, что можно, если хочется,
+
не только делать коммит каждой строчки, не проходя при этом
+
двухчасовые тесты, но и гибко взаимодействовать, забирая и сливая
+
изменения у кого и с кем угодно, и когда кто-то находит баг и
+
исправляет его, он говорит остальным:
+
«Эй, у меня в репозитории лежит фикс на этот баг», и потом,
+
когда эта группа все сделает через две недели, они
+
позвонят менеджеру:
+
«Эй, мы все сделали, скажи главной группе, чтоб они забрали
+
себе обновленный код и они получат новую функциональность, и, кстати, мы его
+
тестили больше двух недель, оно работает и с производительностью все в порядке,
+
так как мы смогли также и профилировать этот код до того,
+
как просить кого-либо его посмотреть».
+
 
+
И эта модель гораздо лучше для разработки.
+
 
+
И это модель, которая используется в разработке ядра Linux.
+
Оказывается, что во многих местах нам не нужна вся эта мощь, даже в ядре.
+
И люди обычно не обмениваются обновленным кодом внутри одной группы, но иногда
+
случается, например, что те, кто работает над сетью, иногда сталкиваются с
+
людьми, которые работают над NFS, и то, что они могут синхронизироваться,
+
действительно помогает.
+
То есть это действительно помогает!
+
 
+
У кого-то еще есть вопрос?
+
 
+
[[Image:Linus-git-googletalk.0-27-03.671.jpg|frame|right|Похоже, что все эти правила и ограничения просто переместились или стали неявными.…]]
+
 
+
'''Из зала:'''
+
 
+
{{question}} Похоже, что все эти правила и ограничения просто переместились или стали неявными.
+
Да, у каждого есть доступ и все играются со своими ветвями в песочнице, но к вечеру
+
ветви нужно соединять и разрешать все конфликты чтобы не было 80
+
миллиардов вариантов каждого линуксового ядра.
+
 
+
'''Линус:'''
+
 
+
Да, именно так.
+
Но на практике вы их никогда не увидите, да там может быть тысяча или
+
двести тысяч различных ветвей, но на практике вы никогда о них не узнаете,
+
потому что вам это не нужно.
+
Вы как бы будете видеть только несколько главных ветвей, может быть даже
+
только одну.
+
 
+
Вот в случае с ядром, полно людей, которые смотрят только на мою ветвь,
+
так что несмотря на то что ветвей может быть очень много, вы можете не обращать
+
на это внимания.
+
И что важно, это способ, которым происходят слияния, он и определяет,
+
насколько все это будет безопасно и надежно.
+
 
+
Через сеть доверия.
+
 
+
Если вы когда-нибудь занимались какой-то работой по безопасности
+
и не использовали концепцию сети доверия, то это был онанизм,
+
а не работа.
+
Я не знаю, чем вы там занимались, но поверьте мне, это единственный способ,
+
который дает безопасность и также единственно верный подход
+
в разработке ПО.
+
 
+
В своей работе я не доверяю всем без исключения.
+
 
+
Более того, на самом деле я крайне циничен и недоверчив.
+
 
+
Я думаю, большинство из вас полностью некомпетентны.
+
 
+
Основной принцип распределенности — это то, что я не должен вам доверять.
+
Я не должен давать вам доступ к коммитам.
+
Но я знаю, что среди оравы середнячков есть несколько человек,
+
достаточно выдающихся, чтобы я им доверял, ибо с ними я уже работал.
+
 
+
Мне нужно доверять только 5, 10, ну может 15 людям.
+
Если у меня есть доверенная сеть, в которую входят эти 5, 10, 15 выдающихся
+
человек, и я знаю, что они выдающиеся, я могу забирать новый код
+
у них.
+
И мне не надо париться на эту тему.
+
 
+
Когда Эндрю присылает мне патчи, он не использует никакого <tt>git</tt>,
+
это в некотором роде недостаток, ну и что, он очень надежный человек.
+
Когда он просит меня принять обновленный код, он просто посылает мне
+
миллион патчей, я просто их применяю.
+
Иногда я не согласен с какими-то из этих патчей, но с другой стороны,
+
доверие означает, как это сказать… «доверять — значит прощать»? Я не знаю…
+
В общем, это означает, что вы должны соглашаться с решениями других людей.
+
 
+
И самое замечательное в доверии — это что оно создает сеть.
+
Именно здесь и появляется сеть доверия.
+
 
+
Мне нужно лишь несколько человек, которым я буду доверять.
+
А у них есть другие люди, которых они выбрали, типа — «тот парнишка шарит покруче
+
меня» — да, это хороший критерий того, от кого вам следует брать исправленный код.
+
Если у вас есть кто-то еще, кто шарит лучше вас, — вперед.
+
Это беспроигрышно.
+
 
+
Даже если окажется, что вы взяли какую-то чушь, кто-то там начнет
+
жаловаться, вы знаете, откуда вы взяли эти исправления, и вы можете просто
+
сказать это жалующемуся «хм, я просто скопировал это, иди к нему, он наверное знал, что делал».
+
 
+
[[Image:Linus-git-googletalk.0-30-08.466.jpg|frame|right|Именно так я и работаю…]]
+
 
+
Именно так я и работаю, скорее всего также действуют и мои поручики/заместители
+
<ref>В оригинале ''lieutenants'', поэтому часто в рунете помощников Линуса зовут «лейтенантами».</ref>.
+
Я забираю изменения по сетевой теме от одного человека, а он получает их от
+
множества других людей, с которыми он постоянно работает, и таким образом все
+
изменения приходят ко всем, и им не нужно собираться всем в одной точке.
+
 
+
Хотя в ядре все приходит в большей степени в одну точку, так, я думаю, сложилось
+
исторически, и на самом деле я всегда пытался поощрять пожелания людей заводить
+
больше деревьев, и у нас действительно есть отдельные деревья по производителям оборудования,
+
у нас есть специальное «-mm»<ref>Экспериментальная ветвь ядра Linux, специализированная на управлении памятью, см. [[EnPedia:Mm_tree]].</ref> дерево, в котором много выделенных «точек», просто так получается, что
+
моя точка привлекает, быть может, больше внимания, чем должна была бы.
+
 
+
Даже если что-то там не придет к этой одной точке, это значит, что
+
можно взять тысячи этих ветвей, игнорируя <tt>99.9%</tt> из них.
+
Зато вам интересно отслеживать, скажем пять ветвей, относящихся к областям, которыми вы интересуетесь.
+
 
+
И все это работает очень естественно.
+
 
+
Одной из хороших вещей в этой целой сети доверия,
+
является не только то, что ее легко технически реализовать,
+
но и то, насколько легко основательно подключить к ней
+
любого человека из этой комнаты.
+
 
+
Люди мыслят именно так.
+
 
+
Мы не знаем сотню людей.
+
У нас есть 5, 7, 10 близких личных друзей, ну ладно, пусть мы асоциальные гики,
+
поэтому у нас их двое, но это основы человеческого сотрудничества, то
+
что у нас есть те, кому мы действительно можем доверять,
+
это семья, это близкие друзья, и все это удобно и привычно, не нужно
+
держать в голове неестественную модель взаимодействия,
+
все подключаются естественным образом.
+
Поэтому работа с этой моделью сетевого доверия дает огромные преимущества.
+
 
+
 
+
[[Image:linus-git-googletalk.0-31-51.970.jpg|frame|right|Знаете ли вы о компаниях, которые используют распределенные системы у себя внутри?]]
+
 
+
'''Из зала:'''
+
 
+
{{question}} Знаете ли вы о компаниях, которые используют распределенные системы у себя внутри?
+
Похоже, тут есть вероятность «сепаратизма» в коде,
+
так как народ, разбредется по собственным песочницам, и
+
не будет вкладываться в основной ствол.
+
 
+
'''Линус:'''
+
 
+
Честно говоря, не так уж и много распределенных систем.
+
Это BitKeeper, очевидно использующийся коммерческими компаниями,
+
мы должны иметь в аудитории кого-нибудь, кто действительно знает, но что …
+
[''комментарий из аудитории''], ага,
+
HP использует такие системы как BitKeeper в проектах разработки принтеров.
+
 
+
Я уверен, что таких компаний немало.
+
В мире open-source ПО, есть пара распределенных
+
систем, которых стоит посмотреть прямо сейчас.
+
Очевидно одна из них — <tt>git</tt>.
+
И вы, конечно, должны выбрать ее.
+
 
+
Но есть и другая — Mercurial, которая на самом деле очень похожа по архитектуре.
+
Есть некоторые различия в деталях архитектуры и большие различия в реализации,
+
но в сухом остатке модели очень похожи.
+
Только <tt>git</tt> делает это лучше.
+
 
+
Все остальное либо централизованное, либо сырое, либо слишком медленное
+
для достаточно больших проектов.
+
 
+
'''Из зала:'''
+
 
+
{{question}} А какие преимущества у компании, когда все играются в собственных песочницах?
+
 
+
 
+
'''Линус:'''
+
 
+
Я думаю, что есть полно компаний, считающих, что такие преимущества есть.
+
 
+
Я знаю это от инсайдеров, и не думаю, что многие компании
+
осознанно используют <tt>git</tt>, в смысле, чтобы решение по его использованию
+
было принято на уровне корпоративного стандарта.
+
 
+
Я знаю несколько компаний, которые внутри
+
используют <tt>git</tt>, не подозревая об этом, потому что они все еще держат
+
свои главные репозитории в Subversion, но многие разработчики затем
+
импортируют код в <tt>git</tt>, потому что <tt>git</tt> действительно хорошо выполняет слияния.
+
Так что вы можете взять дерево веток из Subversion, импортировать в <tt>git</tt>,
+
позволить <tt>git</tt> сделать слияние,
+
что было бы основной головной болью в Subversion,
+
зафиксировать изменения и фактически экспортировать их назад в Subversion,
+
и никто другой даже не узнает, что вы использовали <tt>git</tt>.
+
Немного грустно, но я слышал о многих,
+
работающих в компаниях в точности по этому сценарию.
+
 
+
А вот чтобы постоянно использовать <tt>git</tt> подряд в течении полугода или больше — таких людей пока еще мало.
+
 
+
Мы сделали масштабные улучшения пользовательских интерфейсов,
+
честно говоря, еще год назад в коммерческих компаниях
+
многие говорили, что его слишком трудно использовать.
+
 
+
Я думаю, что мы прошли переломный момент.
+
Git намного проще использовать, чем CVS, правда-правда!
+
+
Большинство людей склоняются к … э-мнэ-э, он проще в использовании, чем что-либо еще.
+
Это всего лишь,… забудьте это.
+
Вы не обязаны использовать все его мощные возможности,
+
некоторые из них могут
+
быть тем, что вы хотели бы объяснить и представить людям только
+
после того, как они преодолеют начальные трудности
+
понимания того, что действительно означает распределенность,
+
но основные вещи делать действительно легко.
+
 
+
 
+
[[Image:linus-git-googletalk.0-34-59.000.jpg|frame|right|Как вы сводите к минимуму конфликты слияний?]]
+
 
+
'''Из зала:'''
+
 
+
{{question}} Одна из характеристик централизованных систем — это то, что именно
+
тот разработчик, который должен коммитить, обязан также
+
провести слияние. Как с этим в <tt>git</tt>?
+
И как вы сводите к минимуму конфликты слияний?
+
 
+
'''Линус''':
+
 
+
Спасибо, что спросили меня об этом!
+
Это не вас ли я просил задать этот вопрос?
+
 
+
Одно из самых приятных свойств <tt>git</tt> это то, что он реально проще
+
разбирается со слиянием, чем все остальные системы.
+
Объединение ветвей в CVS происходит крайне мучительно, просто невыносимо.
+
 
+
По моим подсчетам ядро Линукса — это на самом деле один из крупнейших
+
проектов с открытыми исходниками.
+
У нас <tt>22 000</tt> файлов.
+
 
+
Мы используем <tt>git</tt> уже два года.
+
В течение этих двух лет у нас было в среднем <tt>4.5</tt> слияния в день!
+
 
+
Если бы слияние было бы сложным, то точно пользовались чем-то другим.
+
Так что <tt>git</tt> делает слияния простыми.
+
 
+
Но у вас неизбежно возникнут разборки между какими-нибудь двумя программистами,
+
из тех, кто шлет мне просьбы «пожалуйста, возьми мой код»,
+
а я беру первый попавшийся вариант, просто потому что его заявка оказалась
+
раньше в моем почтовом ящике.
+
 
+
А другой чел поменял код так сильно и его версия настолько конфликтует с остальными
+
(такое бывает, правда не очень часто),
+
что я говорю: «Я мог бы это пофиксить, но мне лень».
+
В их области я не программирую — это не моя сфера интересов,
+
это сетевые технологии или что-то в этом духе,
+
я просто не могу разобраться и оценить этот код, не могу его тестировать,
+
так что просить меня разобраться с этим слиянием — просто глупо,
+
так дела не делаются.
+
 
+
Ага, комп с Виндой опять погас.
+
 
+
Итак, помните, что распределенная модель означает, что «особенных» нет.
+
 
+
Поэтому вместо того чтобы самому разбираться со слиянием,
+
я вытаскиваю первое дерево файлов, в котором не было никаких проблем,
+
и говорю второму участнику:
+
«Эй, я пробовал подгрузить твой код, но там была туча конфликтов со слиянием,
+
совсем не тривиальных, так что я решил, что тебе стоит разобраться с этим самому».
+
 
+
И они разбираются.
+
Они знают, что делать, потому что это их изменения.
+
 
+
Итак, они объединяют изменения и, вероятно, считают меня дебилом,
+
потому что слияние для них так просто и очевидно,
+
что я должен был принять их код с самого начала.
+
 
+
Зато они сами объединяют изменения, обновляют свое дерево файлов и говорят мне:
+
«Эй, теперь можешь забирать рабочий вариант», и я загружаю себе их версию.
+
Они прекрасно сделали всю работу за меня.
+
 
+
В этом-то и есть вся прелесть: ''они все сделали за меня''.
+
А мне достаются честь и хвала!
+
Далее мне просто нужно подсчитать третью составляющую — ''PROFIT!!!''
+
 
+
Все это аспект, естественным образом возникающий в распределенных системах,
+
это не особенность <tt>git</tt>. Да, <tt>git</tt> справляется со слияниями гораздо проще, чем все остальные,
+
но это свойство вытекает из самой распределенной модели.
+
 
+
 
+
[[Image:linus-git-googletalk.0-38-02.885.jpg |frame|right|…зачем вам так нужно иметь эту распределенную систему?]]
+
 
+
'''Зритель''':
+
 
+
{{question}} Слушай, я не совсем понимаю, зачем вам так нужно
+
иметь эту распределенную систему…
+
Ну да, вроде получаешь кучу преимуществ, по крайней мере
+
для коммерческой разработки, да и для разработки open-source наверно очень полезно,
+
поскольку каждый может работать сам по себе,
+
но, когда у тебя централизованная СУВ, общая структура директорий и файлов,
+
не окажется ли, что централизованная система с дешевыми ветками
+
даст тот же самый эффект?
+
Или такое просто невозможно?
+
 
+
 
+
'''Линус''':
+
 
+
Я готов поспорить, что централизованные системы не могут работать нормально,
+
но если у вас корпоративная среда с жестким контролем, то, действительно,
+
централизованные системы работают лучше,
+
и, безусловно, правда в том, что люди используют централизованные системы
+
в течение последних 35 лет.
+
И никто не будет спорить с тем, что централизованные системы не могут работать.
+
 
+
Они не могут работать так же хорошо, как и распределенные системы!
+
 
+
Одна из проблем состоит в том, что у централизованных систем неизбежны проблемы
+
при совместной работе групп из разных мест.
+
 
+
Как правило, они отлично работают если у вас лежит толстенное оптоволокно,
+
и я думаю, что у Гугла наверняка есть своя достойная внутренняя сеть,
+
так что эта проблема для вас, в отличие от остальных, не настолько критична,
+
но, поверьте мне, когда вам не нужно лезть в сеть за каждым файлом,
+
это существенно улучшает производительность.
+
 
+
Эээ… мда, я не могу показать вам демонстрацию,
+
да и не так уж она интересна,
+
но это ноутбук 4-5-летней давности.
+
Что-то типа ''Pentium-M 1.6 GHz''.
+
 
+
Я мог бы показать вам, что полный <tt>diff</tt> проекта Linux Kernel
+
на этом ноуте займет чуть больше секунды.
+
 
+
На моей основной машине, это уже будет меньше десятой доли секунды.
+
 
+
Это прирост производительности, которого вы никогда не добьетесь,
+
работая по сети.
+
 
+
Как только вы стали использовать сеть, хоть для пары пакетов,
+
вы уже впустую потратили производительность.
+
 
+
Так что если у вас децентрализованная система, и вы привыкли
+
делать <tt>commit</tt> или <tt>diff</tt> всего дерева исходников за 30 секунд,
+
то, может быть, 30 секунд вам не покажутся злом.
+
 
+
Но поверьте, когда вы привыкли делать это за одну десятую секунды,
+
30 секунд — это полный отстой.
+
 
+
Так что, даже если вас супер сеть, всегда есть проблемы с производительностью.
+
Не говоря уж о том, что у большинства и в помине нету хорошей сети.
+
 
+
Другая заморочка — это ветки. Даже если вы
+
очень эффективно реализовали ветвления, сам факт того, что вы создаете
+
ветки и каждый может их увидеть, потому что все централизовано, означает,
+
что волей-неволей вам не захочется делать никаких веток.
+
 
+
У вас будут проблемы с пространством имен.
+
 
+
Как вы назовете свою ветку?
+
Вы назовете ее «test»?
+
Ага-ага, уже есть 5000 других веток,
+
названных «test1», «test2», … «test5000», так что вам теперь придется
+
выдумывать новые правила именования
+
ваших веток, потому что у вас централизованная система
+
с централизованным пространством имен у ветвей,
+
что совершенно неизбежно при работе с централизованной системой.
+
 
+
Как же это работает в распределенной среде разработки?
+
 
+
Вы называете свою ветку «test», и все!
+
Ну на самом деле, вам не следовало бы ее так называть, веткам нужно давать имена
+
согласно их функциональности; называйте их кратко, благозвучно
+
и конкретно — что эта ветвь делает.
+
 
+
Git дает вам по умолчанию одну ветку под названием «master»:
+
красиво, коротко и ясно — это ваш основной ствол.
+
 
+
Но вы можете создать ветку под названием
+
«experimental-feature-x» — и все будет понятно.
+
 
+
Но в централизованной среде вы просто не сможете так сделать.
+
Вы не можете назвать ветку «experimental-feature-x».
+
Вы должны придумывать тупые, идиотские названия.
+
 
+
Я работал в компании, у которой были прекрасные скрипты для CVS,
+
настолько прекрасные, насколько это возможно, они помогали создавать ветки.
+
Вы даже могли создать ветку с помощью одной простой команды,
+
это не занимало много времени — система фиксировала имя вашей ветки,
+
добавляя к ней число.
+
Вы определяете базовое имя, говоря:
+
«это моя ветка, она делает то-то и то-то», и система называет
+
вашу ветвь: «то-то-и-то-то—56».
+
 
+
И система добавит тег/закладку там, где вы начали разрабатывать эту ветку,
+
потому что в CVS вам приходится это делать…
+
Это занимало некоторое время, но работало.
+
 
+
Вы можете так извращаться в централизованных системах, но вам не нужно этого делать!
+
 
+
Ваша система децентрализована, она просто работает.
+
 
+
Именно так все и должно работать.
+
 
+
Итак, я ничего не утверждаю, я не собираюсь вас убеждать переходить
+
на децентрализованную систему,
+
я просто констатирую факт: «Вы тупые дебилы»!
+
 
+
Таков расклад.
+
 
+
Как бы то ни было, перейдем к слайду «Performance».
+
 
+
 
+
[[Image:linus-git-googletalk.0-43-15.833.jpg|frame|right|…сколько файлов осилит <tt>git</tt>?]]
+
 
+
 
+
'''Зритель''':
+
 
+
{{question}} Могу я задать вопрос?
+
 
+
'''Линус''':
+
 
+
Давай.
+
 
+
'''Зритель''':
+
 
+
{{question}} На самом деле, два вопроса.
+
Первый: сколько файлов осилит <tt>git</tt>?
+
а второй, представьте, что у вас здоровенная древовидная структура файлов в <tt>git</tt>,
+
возможно ли извлечь только часть этой структуры?
+
 
+
'''Линус''':
+
 
+
Отличные вопросы.
+
 
+
На самом деле, эти вопросы цепляют совсем другую тему,
+
хотя они связаны с производительностью.
+
 
+
Одно из особенных свойств <tt>git</tt> — отслеживание изменений всего содержимого,
+
и это отличает <tt>git</tt> даже от [[EnPedia:Mercurial_(software)|Mercurial]], несмотря на то, что они очень похожи.
+
 
+
Он никогда не отслеживает отдельный файл.
+
Вы не можете прослеживать изменения файла в <tt>git</tt>.
+
 
+
Ну, вы можете проследить изменения проекта, в котором один единственный файл.
+
Если в вашем проекте один файл, то у вас все получится,
+
но если вы отслеживаете изменения в десяти тысячах файлов, то <tt>git</tt> никогда не будет
+
возиться с ними по отдельности.
+
+
Git думает, что все вокруг — это единый проект.
+
Вся история в <tt>git</tt> основана на истории проекта целиком.
+
 
+
Отсюда — важные следствия для производительности.
+
 
+
Когда вы используете CVS, вполне нормально, хотя и глупо,
+
иметь один здоровенный репозиторий с миллионом файлов внутри.
+
 
+
Таким образом, в конце дня, поскольку CVS думает о каждом
+
из миллиона файлов по отдельности,
+
вы можете попросить CVS обновить только один единственный файл —
+
все это в рамках CVS-идеологии.
+
И это верно для множества других моментов.
+
 
+
Точно также работает и BitKeeper, и это является одной из его ошибок.
+
 
+
Проблема мышления в «концепции наблюдения за каждым файлом по отдельности»
+
возникает очень часто, особенно, если вы разработчик высокого уровня (как я).
+
У меня 22 тысячи файлов, и мне пофигу, что происходит с одним из них.
+
Возможно, я буду следить за подмножеством из тысячи файлов,
+
например, коллекцией файлов по подсистеме USB.
+
Но я никогда не беспокоюсь о каком-то отдельном файле.
+
 
+
Поэтому <tt>git</tt> следит за всем, как за коллекцией файлов,
+
и если вы попросите историю конкретного файла,
+
<tt>git</tt> буквально начнет с глобальной истории и упростит ее.
+
Это очень эффективная система, вам даже в голову не придет что это так,
+
но в действительности, когда вы пытаетесь следить за миллионом файлов
+
в репозитории, а потом просите историю конкретного файла — это очень тормозит систему.
+
Таким образом, свойства масштабирования у <tt>git</tt> сильно отличаются от других систем,
+
благодаря этой фундаментальной особенности.
+
 
+
Мы работали с большими репозиториями.
+
Мы импортировали историю проекта KDE из SVN, может быть, не всего,
+
но уж <m>\frac34</m> точно.
+
И KDEнутые … эээ… ''Я не должен так их называть… Я не буду, поверьте, мне нравится KDE.''
+
 
+
Но они засунули все компоненты в один репозиторий!
+
Не слишком умно.
+
Получилось так, что тот репозиторий, который, думаю, весил 8 Гб под CVS,
+
в SVN разбух еще в три раза!
+
Ну может там было меньше 8 Гб под CVS, но он был действительно огромным.
+
Точно больше 4 Гб.
+
Git же сжал это безобразие до где-то 1.3 Гб.
+
 
+
Итак, <tt>git</tt> очень эффективен в обработке этого проекта,
+
почти все работает отлично, но не все и не всегда.
+
 
+
Система не заработает хорошо, если вы поместите миллион файлов
+
в один репозиторий при начальном клонировании.
+
Когда вы его запрашиваете, вы получаете его целиком.
+
Вы сваливаете все в один репозиторий, <tt>git</tt> думает, что это один обьект.
+
Не делайте так.
+
 
+
Если у вас есть множество компонентов, размещайте их в отдельные репозитории,
+
вы можете даже создать суперпроект, в котором содержатся указатели
+
на другие проекты, при этом что-то теряется в пользовательском интерфейсе,
+
но вы храните разные проекты по отдельности.
+
Тогда вы избежите проблемы «получения всего сразу».
+
Потому что с <tt>git</tt> вам придется получить все и сразу.
+
 
+
'''Из зала''':
+
{{question}} Как насчет разделяемого кода?
+
 
+
'''Линус''':
+
 
+
Если они все «расшарили» свой код, что вы можете сделать с помощью <tt>git</tt>,
+
если у вас действительно много «расшаренных» файлов,
+
то поскольку <tt>git</tt> внутри использует «файловую систему идентифицируемую содержимым»,
+
то если существуют одинаковые по содержанию файлы,
+
<tt>git</tt> будет использовать для них в точности один и тот же объект.
+
И сохранит вам тонны свободного места.
+
 
+
И у вас могут быть эти расшаренные объекты, и в тоже время
+
они могут храниться у вас как отдельные сущности.
+
Вы также можете хранить их в раздельных репозиториях,
+
но лежащих на одной разделяемой файловой системе.
+
Вы можете это сделать!
+
+
Если у вас действительно есть расшаренный код, ну например,
+
библиотека, которая используется в пяти разных местах,
+
то если вам стоить использовать поддержку супер-проекта, где у вас есть
+
один репозиторий <tt>git</tt>, который просто отслеживает остальные репозитории <tt>git</tt>,
+
(и он тоже может содержать например, разделяемую инфраструктуру сборки),
+
но при этом индивидуальные части остаются индивидуальными.
+
+
Это похоже на модули CVS.
+
В CVS модули не до конца индивидуальны, но это потому,
+
что в CVS каталог — это вещь, которая всегда сама по себе,
+
так что модуль CVS — это комбинация «каталожности» и их отслеживания,
+
но в целом вы можете думать об этом как о модулях CVS.
+
 
+
В общем, мы поддерживаем такую возможность, но вынужден согласиться,
+
что код довольно сырой, и это единственная область, где
+
наши пользовательские интерфейсы определенно отстают.
+
 
+
Возможно, я забыл ответить на какую-то часть вашего вопроса.
+
 
+
[[Image:linus-git-googletalk.0-49-34.467.jpg|frame|right|Можно ли извлечь из репозитория только часть файлов?]]
+
 
+
'''Из зала:'''
+
 
+
{{question}} Можно ли извлечь из репозитория только часть файлов, а не целый репозиторий?
+
 
+
'''Линус:'''
+
 
+
Вы можете экспортировать тарболы или отдельные файлы,
+
вы можете переписать всю историю, сказав
+
«Я хочу новую версию этого репозитория, которая содержит только эту часть»,
+
вы можете это сделать, это довольно дорогая операция,
+
это что-то типа, импорта старого репозиторий в новый огромный репозиторий,
+
который потом делиться на меньшие части.
+
Вы можете это сделать, но я подчеркиваю, что следует этого избегать.
+
 
+
Неверно, что <tt>git</tt> не может обрабатывать большие проекты,
+
просто производительность будет не так хороша,
+
а вы будете иметь проблемы, которых можно было бы избежать.
+
 
+
Так что я пропускаю этот вопрос и возвращаюсь к теме производительности.
+
 
+
== Performance ==
+
 
+
Одна из вещей, которую я хочу сказать по поводу производительности,
+
это то, что, похоже, огромное количество людей, кажется, думают, что
+
производительность это «как делать то же самое, но быстрее»,
+
а это неправда.
+
 
+
''[показывает слайд «Производительность».]''
+
[[Image:Linus-git-googletalk.0-51-10.996.jpg|right]]
+
 
+
Производительность — в первую очередь не это.
+
 
+
Если вы можете делать что-то действительно быстро,
+
действительно хорошо, люди начнут использовать это по-другому.
+
 
+
Одна из вещей, в которой я хочу вас убедить — это
+
то, что слияния происходят очень-очень быстро, потому что
+
я хочу, чтобы люди сливали как можно раньше и чаще,
+
потому что тогда это легче делать.
+
Если вы объединяете изменения каждый день, вы никогда не попадете
+
в неожиданную ситуацию с тяжелыми трудноразрешимыми конфликтами.
+
 
+
Итак, если вы действительно легко делаете ветвление и слияние,
+
вы избегаете целого класса проблем, которые в противном случае
+
требуют много-много времени, чтобы их избежать.
+
 
+
Например, давайте вернемся к одной из вещей, где,
+
как мне кажется, разработчики Subversion показали себя полными идиотами.
+
 
+
Жестко сказано, правда?
+
 
+
Наверняка несколько из них сейчас в этой комнате.
+
 
+
Ну вы и тупые!
+
 
+
''[смех]''
+
 
+
Например, Subversion очень шумно хвалится, что
+
они исправили CVS, сделав ветвления дешевыми.
+
Это есть на их главной странице, где они вроде говорят,
+
что ветвление в SVN требует ''O(1)'' операций,
+
и что можно сделать дешевых ветвей столько, сколько хотите.
+
 
+
Неважно, что ''O(1)'', мне кажется, на самом деле имеет
+
довольно большое ''O'', но даже если ветвление занимает микросекунду,
+
кого это волнует?
+
 
+
Вы меряете не то, что нужно.
+
 
+
Ветки полностью бесполезны, если Вы не объединяете их,
+
а CVS не может объединить вообще ничего.
+
Вы можете слить изменения однажды,
+
но тогда CVS забывает то, что вы сделали, и вы никогда не
+
сможете объединять снова, не получая адские конфликты.
+
Слияния в Subversion — полная беда.
+
Разработчики Subversion отчасти признают это, и у них есть некий замысел,
+
но эти идеи тоже фигня.
+
 
+
Невероятно, насколько эти люди глупы.
+
Они все время смотрели на проблему неверно.
+
Проблема-то не в ветвлении, а в слиянии!
+
А нормальное слияние они так за пять лет и не сделали.
+
Вот что грустно.
+
 
+
Итак, быстродействие важно, но надо смотреть в корень проблемы.
+
 
+
Затраты на то, чтобы сделать ветку под <tt>git</tt>,
+
буквально заключаются в создании 41-байтного файла.
+
Ну насколько это быстро, как думаете?
+
Не думаю, что вы даже сможете это измерить.
+
Вы можете, в общем, если вы используете Windows, вероятно
+
вы можете измерить это, потому что… [''аудитория: смех'']
+
но как бы то ни было, это так быстро, что реально вы
+
не сможете это измерить.
+
И это создает ветку.
+
Но никого это не волнует, это-то не проблема.
+
 
+
Единственное, что важно, это как быстро вы можете сливать изменения.
+
В <tt>git</tt> вы можете объединить… я сливаю изменения в 22 тысячах файлов несколько раз в день, и я недоволен,
+
если объединение занимает более пяти секунд,
+
и все эти пять секунд загружаются в основном уходят на загрузку ''diffs'', ладно, не ''diffs'',
+
а дельты между двумя деревьями, а само объединение занимает менее
+
чем полсекунды.
+
 
+
И я не должен думать об этом.
+
 
+
Вот что длится дольше чем слияние, это то, что после каждого слияния,
+
по умолчанию <tt>git</tt> сделает <tt>diffstat</tt>
+
всего, что изменилось в результате объединения, потому что
+
мне это важно.
+
Когда я вливаю чьи-то изменения, я им доверяю, но с другой стороны,
+
вдруг они уже забросили свои лекарства?
+
Так что я доверяю им, да, но будем говорить начистоту — может
+
они были в порядке вчера, но сегодня был не их день…
+
Так что для контроля я делаю <tt>diffstat</tt> и <tt>git</tt> тоже делает <tt>diffstat</tt> по умолчанию,
+
хотя вы конечно можете для скорости его отключить, но лучше не надо,
+
<tt>diffstat</tt> по-любому быстр, и обычно занимает…, ну если большое слияние,
+
обычно занимает секунду-другую.
+
Поскольку создание ''diff'' и фактически подсчет статистики о том, сколько
+
строк изменилось — намного более затратная операция,
+
чем выполнение непосредственно слияния.
+
 
+
Это вид быстродействия, который фактически изменяет ваш стиль работы.
+
Это не улучшения быстродействия тех же действий, а возможность работать
+
совершенно по-другому.
+
Вот что на самом деле означает производительность, и вот почему
+
вам не стоить смотреть ни на что, кроме <tt>git</tt>.
+
 
+
Hg (Mercurial) довольно хорош, но <tt>git</tt> лучше.
+
 
+
Я думаю, что у меня заканчивается время, мы посмотрим, есть ли еще …,
+
… о, ОК это все еще интересно.
+
 
+
Мы еще не добрались до части про реализацию,
+
но не беспокойтесь, я сейчас я много об этом расскажу:
+
реализация очень проста.
+
 
+
Код и структуры данных очень-очень-очень просты.
+
Если вы посмотрите на исходный текст и поймете,
+
что там всего где-то 80000 строк, в основном на Cи,
+
ну на таком Си, на котором пишу я — большинство его не понимает,
+
но зато я комментирую код.
+
 
+
Исходный код может порой выглядеть сложным,
+
потому что мы очень печемся о производительности, особенно я.
+
Я действительно забочусь об этом, и иногда заставляю вещи работать сильно быстрее,
+
но при этом приходится использовать более сложные алгоритмы,
+
чем последовательная проверка файлов по очереди.
+
Когда вы делаете слияние 22 тысяч файлов, вы не хотите проверять по одному файлу,
+
вы хотите посмотреть все дерево сразу и сказать:
+
«А они же одинаковые, я не должен ничего делать».
+
В общем, <tt>git</tt> делает все такие штуки, и все это несколько раздувает объем кода,
+
ибо по-уму все это сделать непросто, но основы все же очень и очень просты.
+
 
+
И одна из этих основ, это аспект безопасности и надежности.
+
 
+
''Показывает слайд:''
+
[[Image:linus-git-googletalk.0-56-39.330.jpg|center]]
+
 
+
Когда <tt>git</tt> отслеживает ваш проект, мы сжимаем каждый блок данных,
+
вычисляя дельту (различия) по отношению ко всем другим блокам,
+
кроме того мы вычисляем SHA-1 хеш, который проверяется при
+
необходимости достать этот блок.
+
 
+
Если у вас побился диск или память, или что-то еще в этом роде — <tt>git</tt> об этом сообщит.
+
Это даже не вопрос. Это безусловная и безоговорочная гарантия.
+
 
+
У вас могут быть люди, пытающиеся навредить.
+
У них не выйдет.
+
 
+
Вам нужно точно знать 20 байтов 160-битного SHA-1 хеша от верхушки вашего дерева,
+
и если вы их знаете, вы сможете доверять вашему дереву сверху донизу,
+
всей истории целиком.
+
У вас может быть десять лет истории проекта с сотней тысяч файлов,
+
миллионами ревизий, но вы сможете доверять любой части любой ревизии.
+
Потому что <tt>git</tt> такой надежный, и все его основные структуры данных
+
очень-очень просты.
+
 
+
Да, мы проверяем контрольные суммы.
+
Но мы не считаем ''слабую'' контрольную сумму, как у некоторых UDP пакетов,
+
то есть 16-битную сумму всех байтов.
+
Мы проверяем контрольные суммы, которые считаются криптографически стойкими.
+
 
+
Никто не может взломать SHA-1, но дело в том, что для <tt>git</tt>,
+
SHA-1 это не функционал информационной безопасности,
+
а просто проверка целостности.
+
Безопасность там отдельно.
+
 
+
А то полно народу думают, что раз <tt>git</tt> использует SHA-1,
+
а SHA-1 используется во всяком криптографическом софте,
+
то наверно это крутая фича в безопасности.
+
Так вот, ничего тут нет общего с безопасностью,
+
это просто самый лучший хеш из имеющихся.
+
 
+
Хороший хеш дает гарантию целостности данных, а также
+
кучу других возможностей, например, то, что когда мы хешируем обьекты,
+
мы знаем, что получившийся хеш будет иметь добротное, годное распределение,
+
и нам не нужно беспокоится о разных проблемах с ним.
+
С точки зрения реализации, это означает, что мы считаем, что
+
хеш настолько хорош, что мы можем использовать этот алгоритм хеширования,
+
и считать, что у нас нет плохих случаев (коллизий).
+
 
+
Ну то есть, есть тут некоторые основания и с криптографической стороны,
+
но все это только про гарантии целостности ваших данных.
+
Я вам гарантирую, что если вы положите ваши данные в <tt>git</tt>,
+
спустя пять лет, даже если вы сконвертировали их с вашего
+
винчестера на какой нибудь DVD, или что там будет вместо него,
+
вы сможете проверить ваши данные и вернуть их назад в том же состоянии,
+
в котором вы поместили их в систему.
+
Именно этого вы и должны ждать от любой системы контроля версий.
+
 
+
Одна из причин, по которой я так агитирую за это, состоит в том,
+
что у нас был случай со взломом одного из сайтов BitKeeper’а,
+
когда народ пытался испортить репозиторий с исходниками ядра,
+
а BitKeeper отловил эту попытку.
+
Но BitKeeper не имеет по настоящему крутого хеша,
+
думаю, там простейший 16-CRC код, или что-то типа этого.
+
+
В принципе, это достаточно, чтобы заметить неуклюжую попытку подмены,
+
криптографически оно ненадежно, но на практике атаки сделать уже непросто,
+
так что тогда атака была немедленно пресечена.
+
 
+
Но после того, как такое случилось,
+
когда ты уже погорел на этом,
+
уже не хочется попасться в эту же ловушку снова.
+
 
+
Нет, ну может ваши проекты и не очень важные, но мои проекты точно важны, и поэтому
+
я об этом так пекусь.
+
 
+
Это — также одна из причин, … вернемся на секунду к концепции распределенности …,
+
ну, например, вы делаете ваш проект [[EnPedia:Google Code|Google code]],
+
где можно держать исходники в ваших репозитариях,
+
так вот — я бы никогда не доверил Google хранить и поддерживать мои исходники.
+
Извините, но вы еще не заслужили моего доверия.
+
 
+
Причина, по которой я предпочитаю распределенные системы,
+
состоит в том, что я могу держать свой исходный текст позади
+
трех брандмауэров на системе, которая не позволяет даже по <tt>ssh</tt> войти.
+
Вот здесь я не могу читать свою электронную почту, потому что моя почта
+
идет на мою машину и единственный путь, как я могу попасть на мою машину
+
— это когда я физически нахожусь в той сети.
+
 
+
Может я конечно и полностью свихнулся, может только слегка сдвинулся,
+
и я забочусь о безопасности больше, чем большинство окружающих.
+
Да и вообще, чтобы я дал эталонную копию репозитария исходников,
+
о котором я так пекусь, куда-то на сторону?
+
Абсурд!
+
+
Даже Гуглу не дам.
+
Никогда в жизни, хоть ты меня режь.
+
 
+
Я позволю Google держать копию репозитория, но
+
хочу чтобы было что-то, про что я знаю точно, что никто это не трогал.
+
 
+
Кстати, я не такой уж и крутой сисадмин, так что сбой на винте
+
для меня определенно будет проблемой, так как бэкапами я не заморачиваюсь.
+
Но все будет в порядке, если я смогу загрузить обратно данные из нескольких
+
доверенных источников. Я смогу их сравнить друг с другом, это реально просто,
+
я смогу сверить их хеши с теми самыми 20 байтами, о которых я очень-очень
+
заботился — надеюсь, в нескольких местах они останутся.
+
 
+
20 байтов отследить легче, чем 180 МБ.
+
 
+
И очень маловероятно, что побьются именно эти 20 байтов.
+
 
+
И если у меня есть эти 20 байтов, я могу загрузить <tt>git</tt>-репозитрий даже
+
из совершенно «левого» источника, и могу гарантировать, что они не сделали с ним ничего плохого.
+
 
+
Ваш проект [Google Code] — хостинг репозитариев для народа — крутое и благое дело,
+
вот только вы неправильно делаете, если используете для него Subversion.
+
Из-за вас люди ночами спать спокойно не будут!
+
 
+
Конечно, если вы делаете это для 70 … , сколько там проектов,
+
75 тысяч?
+
Большинство из них довольно мелкие и ерундовые, так что все в порядке.
+
Но если бы вы все сделали правильно, люди бы чувствовали себя получше.
+
 
+
У меня есть еще несколько слайдов,
+
Но я думаю, что мы уже превысили лимит времени,
+
и не хотелось бы грузить вас их показом,
+
я думаю, они не очень интересны.
+
 
+
== Content Management ==
+
 
+
Я уже немного говорил на тему «Полный целостный проект vs. Отдельные файлы»,
+
и что <tt>git</tt> отслеживает именно полный проект.
+
 
+
[[Изображение:linus-git-googletalk.1-03-18.642.jpg|framed|right| «Это гораздо больше чем случайный набор файлов»]]
+
 
+
Ну тут на слайде единственный пример с вызовом из командной строки,
+
''gitk'' — это GUI вьювер истории проекта под <tt>git</tt>,
+
это скрипт на tcl/tk для просмотра всей той информации, которую <tt>git</tt>
+
действительно хорошо показывает, а вот это пример командной строки, которую я использую как
+
«мейнтейнер» высшего уровня.
+
 
+
Я хочу просто спросить «что изменилось с некоторой версии», или быть может «некоторой даты».
+
Я могу легко выяснить, что поменялось «в этих двух каталогах» или
+
«в этих двух каталогах и этом файле»,
+
и мне будет показана полная история, относящаяся к этой части репозитория.
+
 
+
Это более затратно, чем просто посчитать полную историю всего проекта.
+
Если бы мой ноутбук был подключен сейчас к видеовыходу,
+
я бы показал, что все это происходит за считанные секунды,
+
то есть дороговато, но в целом ничего.
+
 
+
Этот функционал <tt>git</tt> по-настоящему уникален!
+
Больше никто этого не может, а эта функциональность очень важна!
+
Может быть, она и не так важна для отдельного разработчика,
+
потому что отдельный разработчик часто думает в терминах отдельных файлов,
+
но важно для людей, объединяющих версии проекта.
+
Это важно для таких как я и тех, с кем я непосредственно работаю,
+
потому что они практически никогда не заботятся об отдельных файлах,
+
а вот такие вещи для них важны.
+
Кто-нибудь отправляет отчеты об ошибке, которые не всегда адекватны,
+
но пусть вам попался довольно вменяемый отчет,
+
и вы можете сразу засечь — «Ага, это подсистема SCSI».
+
 
+
Вот командная строка (''указывает на слайд'').
+
 
+
Вы не можете указать точно проблемный файл, но можете сказать:
+
«Удали последние 15 тысяч коммитов, сделанных с прошлой недели, и он откатит
+
проект до 50 [коммитов]»
+
 
+
Это круто, и никакая другая система так не может, уверяю.
+
 
+
Вот поэтому вы и должны хотеть использовать именно <tt>git</tt>.
+
Вот к чему это сводится.
+
Он надежен и так безопасен, что вы можете делать то, что
+
остальные системы или не делают, или делают очень медленно,
+
и кроме того, он распределенный.
+
 
+
Итак, продолжим.
+
Полагаю, мы можем позволить ответить на еще один вопрос.
+
Что у нас с временем, я как-то без понятия… Ладно, давайте быстро.
+
 
+
 
+
[[Image:linus-git-googletalk.1-05-57.109.jpg|framed|right|…будет просто дрейф проблем с масштабируемостью…?]]
+
 
+
'''''Слушатель:'''''
+
 
+
{{question}} Итак, причина ухода с Perforce — на самом деле масштабируемость и эффективность.
+
Иначе люди просто продолжат ее использовать.
+
И может, при переходе будет просто дрейф проблем с масштабируемостью и производительностью
+
из одной области в другую?
+
 
+
'''''Линус:'''''
+
 
+
Ну я уже говорил, что я без понятия, как вы работаете
+
с Perforce, и какие с ним проблемы, но если вы перейдете на <tt>git</tt>,
+
вы можете быть в нем уверены, если, конечно,
+
вы будете использовать его в разумных пределах.
+
А эти пределы обычно достаточно очевидны.
+
У вас есть компилятор, основные исходники,
+
документация, ну может ваша документация разбросана как-то фрагментами,
+
хотя наверняка у вас есть что-то типа пользовательской документации,
+
может в Google не так, но во многих компаниях отдельно
+
идет набор документации для потребителей
+
и документации, сопровождающей отдельные модули и пакеты.
+
 
+
Так что одним из моментов использования <tt>git</tt>, о котором стоит подумать,
+
это как организовать разумную структуру проекта.
+
Git легко поддерживает здоровые проекты, вы можете без проблем держать в нем
+
десятки тысяч файлов, вот в Ядре, например, их 22 тысячи.
+
Мы тестировали на ста тысячах — и все было в порядке — <tt>git</tt> быстрей, чем что бы то ни было.
+
 
+
С миллионом файлов, подозреваю, другие системы, могут быть в чем-то и побыстрее.
+
И не хотелось бы, чтобы вы попали в такую ситуацию.
+
Но если вы правильно организуете проект и грамотно настроите,
+
<tt>git</tt> будет и быстрее и лучше, что все остальное.
+
Я уверен в его исключительной производительности.
+
 
+
Вот одна из вещей, которую мы не очень хорошо делаем,
+
это «CVS annotate»<ref>Команда, сообщающая по каждой строчке автора, совершившего в этой строчке последнее изменение и последнюю ревизию, в которой эта строчка менялась.</ref>.
+
Люди часто используют эту команду.
+
Я говорил, что у Perforce оно тормозит, так что вы,
+
вероятно, хотя и не уверен, не используете Perforc’ный «annotate».
+
Но пользователи CVS используют «CVS annotate»,
+
эту единственную операцию, которую CVS может выполнять быстрее, чем <tt>git</tt>,
+
потому что CVS работает «пофайлово», а <tt>git</tt> — нет.
+
 
+
У <tt>git</tt> есть «annotate», но фактически это будет поиск,
+
вы можете узнать об этом, если вы переместите функцию из одного файла в другой,
+
<tt>git</tt> дословно воспроизведет историю функции, даже несмотря на перемещение.
+
Внимание, не перемещение файла, а функцию в пределах файла
+
он пойдет и откопает и скажет:
+
«Эй! Эти две строки на самом деле пришли из
+
того файла 5 лет назад».
+
 
+
Опять-таки, это оригинальный функционал, который больше никто не тянет,
+
и сводится он к тому же, что рулит контент проекта целиком, а не файлы по отдельности.
+
Но за это приходится платить, так что если вы отматываете лет на пять назад,
+
это может занять секунд 30.
+
На ядре это занимает секунду для любого имеющегося у меня файла,
+
ведь два года назад мы начали историю с чистого листа, решив
+
«давайте не будем усложнять то, что не требуется»,
+
— и прямо сейчас у нас имеется только двухлетняя история ядра.
+
 
+
В других проектах у нас есть история и подлинней,
+
мы делали на них замеры, например, после импорта KDE и других проектов
+
с еще более длинной историей.
+
Тут бывают проблемы с производительностью, но все равно даже
+
с учетом таких проблем <tt>git</tt> на один-два порядка быстрее, так что
+
в основном беспокоиться не о чем.
+
 
+
И если обнаружите какую-нибудь проблему, то у нас сейчас очень-очень
+
классное сообщество.
+
В <tt>git</tt>-овом списке email-рассылок уровень «шума» очень мал,
+
и хотя писем там изрядное количество, это очень вменяемый мейллист.
+
Итак, если кто-то заинтересовался, посмотрите исходники,
+
но начните с просмотра архива рассылки.
+
У нас есть и свои флеймы, есть и бесцельные споры,
+
но большинство сообщений там весьма хороши.
+
 
+
OK? Спасибо…
+
 
+
[''апплодисменты'']
+
 
+
== Ссылки ==
+
<references/>
+
 
+
{{replicate-from-custiswiki-to-lib}}
+

Текущая версия на 01:19, 18 февраля 2010

Перенаправление на: