<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://lib.custis.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abatishchev</id>
		<title>CustisWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://lib.custis.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Abatishchev"/>
		<link rel="alternate" type="text/html" href="https://lib.custis.ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Abatishchev"/>
		<updated>2026-06-29T12:43:40Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.4</generator>

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

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

	</feed>