<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>Debiania</title>
        <link>https://blog.debiania.in.ua</link>
        <description><![CDATA[О Linux]]></description>
        <atom:link href="https://blog.debiania.in.ua/feeds/linux-rus.rss" rel="self"
                   type="application/rss+xml" />
        <lastBuildDate>Fri, 29 Aug 2014 00:00:00 UT</lastBuildDate>
        <item>
    <title>Каких демонов перезапускать после обновления?</title>
    <link>http://blog.debiania.in.ua/posts/2014-08-29-checking-for-processes-to-restart.html</link>
    <description><![CDATA[<p>В лучших традициях блоггинга, выношу из личной переписки то, что <a href="https://bnw.im/p/NF0AU5">рассказываю уже
не в первый раз</a> — теперь буду просто ссылаться сюда.</p>
<p>Как вы, наверное, знаете, в *nix, <strike>в отличие от
Windows</strike><a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>, можно удалить открытый
кем-то файл; при этом имя из файловой системы пропадает сразу, а место, занятое
данными, освободится лишь после закрытия файла всеми процессами.</p>
<p>При обновлении системы ситуацию с уже удалёнными, но всё ещё кем-то
используемыми файлами можно встретить сплошь и рядом: при обновлении библиотеки
старый <code>.so</code> может быть удалён, а на его место под тем же именем помещена новая
сборка. При этом процессы, использующие старую версию, будут продолжать ею
пользоваться, а новые будут запускаться уже с обновлённой. Это может привести
к проблемам: к примеру, в случае с Heartbleed одного только обновления <code>libssl</code>
мало, нужно ещё и перезапустить <code>sshd</code>, Nginx, Apache и вообще всё-всё-всё, что
работало с SSL.</p>
<p>В Debian есть готовое решение, работающее с любым демоном — <code>checkrestart</code>
(пакет <code>debian-goodies</code>). Он показывает, какие из демонов пользуются устаревшими
файлами, и объясняет, как их перезапустить.</p>
<p>Однострочник, которым я пользуюсь, чуть более примитивен и при этом немного
более универсален: он смотрит на все без исключения процессы, не разбираясь,
демон это или нет:</p>
<pre><code>$ sudo lsof / | grep DEL | cut -f1 -d' ' | sort -u</code></pre>
<p>Что он делает:</p>
<ol type="1">
<li><p><code>lsof</code> показывает все-все-все открытые файлы и сокеты. <code>lsof /</code>
показывает только файлы. При запущенном торрент-клиенте, постоянно
плодящем соединения, вывод сокетов занимает кучу времени, поэтому
я отсеиваю их на этом этапе;</p></li>
<li><p>в выводе <code>lsof</code> присутствует колонка <code>TYPE</code>, показывающая тип
открытого ресурса: файл (<code>REG</code>), директория (<code>DIR</code>), сокет (<code>IPv4</code>
или <code>IPv6</code>) и, наконец, файлы, которые были удалены (<code>DEL</code>). Есть ещё
целая куча других типов, читайте lsof(8). В общем, <code>grep DEL</code>
выдирает строки с удалёнными файлами;</p></li>
<li><p>в получившемся списке меня интересуют только имена процессов (первая
колонка), поэтому я вырезаю её (<code>cut</code>) и сортирую, удаляя повторяющиеся
строки (<code>sort -u</code>);</p></li>
<li><p><em>voilà</em>: теперь у нас есть список процессов, которые нужно перезапустить.
Эту часть я всё никак не соберусь автоматизировать.</p></li>
</ol>
<p>Некоторые процессы могут перезапускаться не самостоятельно, а вместе
с другими, например:</p>
<ul>
<li>для перезапуска <code>udisksd</code>, <code>polkitd</code> и <code>console-kit</code> нужно перезапустить
<code>dbus</code>;</li>
<li>для перезапуска <code>dhclient</code> и <code>wicd-monitor</code> нужно убить <code>dhclient</code> (<code>sudo   pkill dhclient</code>), перезапустить <code>wicd</code> и, кажется, переподключиться
к сети.</li>
</ul>
<p>Некоторые другие процессы перезапустить вообще нельзя (например, <code>systemd</code> — там
хоть и есть <code>daemon-reexec</code>, но у меня он почему-то никогда не работает).</p>
<p>И, конечно же, не следует забывать про ядро — в списке процессов его не видно,
но обновления придти могут. Тут уже только ребут поможет (или ksplice, но
ребутнуться проще :)</p>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>Мой читатель ForNeVeR подсказывает, что в Windows на самом деле <em>можно</em>
удалить открытый кем-то файл, если только открывший потрудился <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx" title="CreateFile function">указать
в вызове <code>fopen</code> флаг <code>FILE_SHARE_DELETE</code></a>.<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>]]></description>
    <pubDate>Fri, 29 Aug 2014 00:00:00 UT</pubDate>
    <guid>http://blog.debiania.in.ua/posts/2014-08-29-checking-for-processes-to-restart.html</guid>
    <dc:creator>Александр Батищев</dc:creator>
</item>
<item>
    <title>Управление дотфайлами в $HOME с помощью vcsh</title>
    <link>http://blog.debiania.in.ua/posts/2013-12-16-managing-home-dotfiles-with-vcsh.html</link>
    <description><![CDATA[<p>Нынешнюю арку о надстройках над Git я хотел бы завершить рассказом о почти
неизвестной<a href="#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>, но весьма крутой программе под названием vcsh.
Расшифровываться это имя <a href="https://archive.fosdem.org/2012/schedule/event/vcsh" title="vcsh - manage config files in $HOME via fake bare git repositories">может по-разному</a>, но мне больше
всего нравится «version control system for <code>$HOME</code>» — сразу становится понятно,
что программа предназначена для хранения дотфайлов в системе контроля версий.</p>
<p>Одну из причин, по которым вы можете захотеть хранить свои дотфайлы в СКВ, <a href="https://blog.debiania.in.ua/posts/2013-12-14-one-reason-to-put-configs-into-vcs.html" title="Debiania — Одна причина хранить конфиги в системе контроля версий">я
уже приводил</a> в начале этой мини-серии. Для полноты картины приведу
и вторую (наверное, есть куча дополнительных, но эти две я считаю наиболее
важными): благодаря контролю версий у вас появляется возможность
синхронизировать конфиги между разными машинами. Лично меня невероятно
раздражает, когда я посреди какой-то работы вдруг обнаруживаю, что программы
ведут себя не совсем так, как я привык, и всё из-за того, что на текущей машине
конфиги чуть старше, чем на предыдущей. Случается такое редко, но меня это
в итоге настолько достало, что я решился-таки положить свои конфиги под Git.</p>
<p>В результате появился репозиторий, представляющий из себя кучку дотфайлов
и скрипт, который создавал в <code>$HOME</code> симлинки. Это было не слишком удобно,
потому что в случае добавления в репозиторий нового дотфайла я должен был не
забыть на всех остальных машинах этот скрипт запустить. Кроме того, мне не
нравилось отсутствие тотальности: репозиторий знал только о тех конфигах,
о которых я позаботился ему сообщить. Если я ставил новую программу, конфиг
которой мне хотелось бы хранить в Git, я должен был не забыть его туда
добавить — сам по себе <code>git status</code> мне о нём не сообщал. В общем, пользоваться
этим способом можно, но удобств никаких.</p>
<p>vcsh же даёт гораздо менее костыльное и при этом более мощное решение. Он хранит
репозиторий (историю Git) в <code>.config/vcsh/repo.d</code>, а сами конфиги оставляет
лежать в домашней директории. Это гораздо лучше смотрится в выводе <code>ls</code>, чем
былое обилие симлинков. Это также даёт возможность разбивать ваши дотфайлы на
несколько наборов, каждый из которых хранится в отдельном репозитории
и клонируется независимо от других<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a>. Выделив свой
<code>.vimrc</code> в отдельный репозиторий, вы наконец-то сможете везде иметь одинаковую
среду редактирования текста, не таская при этом всякую мишуру вроде настроек
MPlayer и XScreenSaver (она теперь будет в отдельном репозитории).</p>
<p>Кроме того, vcsh рассматривает мой <code>$HOME</code> как свою рабочую директорию, так что
я получаю желанную «тотальность»: теперь <code>git status</code> будет сразу сообщать мне
обо всех незнакомых файлах (с учётом <code>.gitignore</code>, конечно). Ура, ура, ура!</p>
<blockquote class="warning">
<p>Сейчас мы будем делать что-то, что может повредить ваши данные. Советую закрыть
все приложения и сделать бекап дотфайлов, например, вот так: <code>tar cvjf dotfiles.tbz2 ~/.*</code></p>
</blockquote>
<p>От слов — к делу. Предварительно вернув <code>$HOME</code> к первозданному виду (чтобы
дотфайлы были файлами, а не симлинками на них), установим vcsh (в Squeeze
придётся подключить backports, в более новых релизах всё уже в main)
и инициализируем репозиторий:</p>
<pre><code>$ cd    # вся работа происходит непосредственно в $HOME
$ sudo aptitude install vcsh
$ vcsh init dotfiles</code></pre>
<p>Теперь перейдём в специальный режим, где все вызовы git будут относиться
к свежесозданному репозиторию, и добавим в него несколько конфигов:</p>
<pre><code>$ vcsh enter dotfiles
$ git add .vimrc .tmux.conf
$ git commit -m'Initial commit'</code></pre>
<p>Чтобы в выводе <code>git status</code> вам не мешали обычные файлы, советую добавить
в начало <code>.gitignore</code> вот такие строки:</p>
<pre><code>*       # ignore everything...
!.*     # ...but dotfiles
!.*/**  # ...and &quot;dotdirs&quot;</code></pre>
<p>Думаю, из комментариев понятно, что именно они делают.</p>
<p>При желании ваш репозиторий можно опубликовать на GitHub (не забудьте
предварительно создать его через веб-интерфейс и поменять в команде ниже адрес
на тот, который вам сообщит сайт):</p>
<pre><code>$ git remote add origin 'git@github.com:Minoru/dotfiles.git'
$ git push origin master:master
$ git branch --track master origin/master</code></pre>
<p>Выйти из режима, в который мы попали после <code>vcsh enter</code>, можно с помощью
<code>Ctrl-D</code>, <code>exit</code> или просто закрыв окно терминала.</p>
<p>Чтобы не забывать коммитить сделанные изменения, можно добавить в свой crontab
напоминалку, которая будет писать вам на локальное мыло (читается с помощью
<code>mail</code>):</p>
<pre><code>$ crontab -e
# каждое утро рапортовать о локальных изменениях в репозитории dotfiles
13 7 * * * vcsh dotfiles status --short</code></pre>
<p>Точно так же можно организовать автоматические <code>push</code> и <code>pull</code>, но это останется
вам в качестве домашнего задания ☺</p>
<p>На этом обзор базовых возможностей можно считать завершённым. Обязательно
пролистайте <code>/usr/share/doc/vcsh/README.md.gz</code> — файл хоть и длинный, но
содержит хорошие описания команд и даст вам представление о том, что же умеет
vcsh. До новых встреч!</p>
<section id="footnotes" class="footnotes footnotes-end-of-document" role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>В феврале 2012-го в своём <a href="https://archive.fosdem.org/2012/schedule/event/vcsh" title="vcsh - manage config files in $HOME via fake bare git repositories">докладе</a>
Ричард Хартманн (Richard Hartmann), разработчик vcsh, сказал, что на данный
момент у него десяток-два пользователей (смотрите видео с 09:32). Согласно
Debian Popularity Contest, <a href="http://qa.debian.org/popcon.php?package=vcsh" title="Popularity contest statistics for vcsh">на данный момент vcsh установило почти две
с половиной сотни пользователей Debian</a>. Сколько из них
действительно пользуются программой, сказать сложно.<a href="#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2"><p>Да, решение с симлинками тоже позволяет такое делать,
но мороки в этом случае всё же больше.<a href="#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>]]></description>
    <pubDate>Mon, 16 Dec 2013 00:00:00 UT</pubDate>
    <guid>http://blog.debiania.in.ua/posts/2013-12-16-managing-home-dotfiles-with-vcsh.html</guid>
    <dc:creator>Александр Батищев</dc:creator>
</item>
<item>
    <title>Порекламирую-ка git-annex</title>
    <link>http://blog.debiania.in.ua/posts/2013-12-15-advertising-git-annex.html</link>
    <description><![CDATA[<p>Вчера я уже упоминал один из проектов Joey Hess — etckeeper. Сегодня же хочу
обратить ваше внимание на другую его разработку, которая называется
<a href="https://git-annex.branchable.com/" title="git-annex webpage">git-annex</a>. В рунете почему-то имеется <a href="http://welinux.ru/post/7157/" title="welinux.ru / Я рекомендую — git-annex">всего</a>
<a href="http://www.opennet.ru/opennews/art.shtml?num=33933" title="OpenNews: В рамках проекта git-annex assistant развивается аналог Dropbox на базе Git">несколько</a> <a href="https://www.linux.org.ru/news/opensource/7791116/page2#comments" title="Linux.org.ru: Собственный аналог dropbox — git-annex assistant">упоминаний</a> о нём, в основном с тех времён,
когда разработчик собирал деньги на Kickstarter. Есть также пара
<a href="https://juick.com/DespicableMe/2200037" title="Juick.com / @DespicableMe / #2200037">развёрнутых</a> <a href="http://debian.2.n7.nabble.com/Dropbox-td2823861.html" title="debian-russian — Dropbox своими руками">обсуждений</a> и даже <a href="http://kolyan-ufalug.psto.net/ttshoi" title="Kolyan-ufalug.psto.net">ряд</a>
<a href="https://juick.com/istitov/2060256" title="Juick.com / @istitov / #2060256">идивидуальных</a> <a href="https://juick.com/qnikst/2495453" title="Juick.com / @qnikst / #2495453">отзывов</a>, но этого,
как по мне, все равно слишком мало. Надеюсь, этот пост позволит новым
пользователям открыть для себя эту замечательную программу.</p>
<p>Перед тем, как отправиться в путь, последнее замечание: я предпочитаю консольные
интерфейсы, и говорить буду именно о них. У git-annex есть веб-интерфейс
и я уверен, что через него можно удобно управлять вашим репозиторием, но я этим
средством почти не пользовался и потому не знаю, насколько оно совершенно. Если
у вас острая нетерпимость CLI, пожалуйста, не читайте дальше.</p>
<div class="center">
<p><a href="https://blog.debiania.in.ua/images/git-annex-assistant-joeyh-screenshot.png">
<img src="https://blog.debiania.in.ua/images/git-annex-assistant-joeyh-screenshot-thumbnail.jpg" width="400px" height="234px" loading="lazy" alt="Git-annex web UI" class="bleed" />
</a></p>
</div>
<p>Итак, предлог следующий. У многих из нас есть коллекции фотографий, музыки,
научных статей, видео с конференций — кучи немаленьких файлов, которые хотелось
бы использовать на нескольких машинах сразу, или же удобно архивировать на DVD
(или что вы там используете). Эти (как и некоторые другие) задачи и призван
решать git-annex.</p>
<p>Технически говоря, git-annex — это надстройка над системой контроля версий Git,
но пусть вас это не пугает — с собственно Git’ом вам общаться не придётся, если
только вы сами этого не захотите. Git-annex добавляет Git’у новые команды,
с помощью которых вы можете инициализировать и управлять своим annex’ом.</p>
<p>Кстати говоря, annex может быть добавлен к любому git-репозиторию, но об этом
я здесь говорить не буду — если интересно, почитайте сайт проекта.</p>
<p>Мощь и красоту этой утилиты лучше показывать, а не описывать, так что перейдём
к делу. Joey — разработчик Debian, так что не странно, что в нашем с вами
любимом дистрибутиве для git-annex есть готовенький пакет:</p>
<pre><code>$ sudo aptitude install git-annex</code></pre>
<blockquote class="warning">
Я доверяю git-annex все свои мультимедийные данные, и пока что он меня не
подводил. Тем не менее, я не советую вам вот так сразу помещать под его
управление единственную копию ваших фотографий, публикаций или что вы там
собрались в нём хранить — сделайте копию, поэкспериментируйте на ней, а как
свыкнитесь с командами, пробуйте уже на «живых» данных.
</blockquote>
<p>Перейдём-ка в какую-нибудь директорию с файлами и попробуем создать в ней
annex:</p>
<pre><code>$ cd my-first-annex
$ ls -R
.:
avatar.jpg  avatar-myopenid.png  summer_camp_2012  wallpaper.png

./summer_camp_2012:
DSC05599.jpg  DSC05602.jpg  DSC05604.jpg  DSC05605.jpg
$ git init .
Initialized empty Git repository in /tmp/my-first-annex/.git/
$ git annex init 'notebook'
init notebook ok
(Recording state in git...)</code></pre>
<p>Как видите, сперва мы создали git-репозиторий, а затем уже инициализировали
в нём annex. Обязательным параметром <code>git annex init</code> является название annex —
зачем он нужен, вы узнаете чуть позже.</p>
<p>Добавим и закоммитим файлы:</p>
<pre><code>$ git annex add .
add avatar-myopenid.png (checksum...) ok
add avatar.jpg (checksum...) ok
add summer_camp_2012/DSC05599.jpg (checksum...) ok
add summer_camp_2012/DSC05602.jpg (checksum...) ok
add summer_camp_2012/DSC05604.jpg (checksum...) ok
add summer_camp_2012/DSC05605.jpg (checksum...) ok
add wallpaper.png (checksum...) ok
(Recording state in git...)
$ git commit -m&quot;Добавил аватарки и пару летних фоток&quot;
[master (root-commit) d312aca] Добавил аватарки и пару летних фоток
 7 files changed, 7 insertions(+)
 create mode 120000 avatar-myopenid.png
 create mode 120000 avatar.jpg
 create mode 120000 summer_camp_2012/DSC05599.jpg
 create mode 120000 summer_camp_2012/DSC05602.jpg
 create mode 120000 summer_camp_2012/DSC05604.jpg
 create mode 120000 summer_camp_2012/DSC05605.jpg
 create mode 120000 wallpaper.png
$ ls -l avatar.jpg
lrwxrwxrwx 1 minoru minoru 192 Dec 14 06:38 avatar.jpg -&gt;
.git/annex/objects/7v/Q7/SHA256E-s7164--b442aaed464409198c19f37614dd6e7fd82ee658b897deaddf9a51b08c1aa19f.jpg/SHA256E-s7164--b442aaed464409198c19f37614dd6e7fd82ee658b897deaddf9a51b08c1aa19f.jpg</code></pre>
<p>Ой, что случилось? Не переживайте, всё именно так, как должно быть. В отличие от
git, который не трогает ваши файлы, а только запоминает их состояние, git-annex
переместил все наши фотографии в глубины <code>.git/annex/objects</code>, а в рабочей
директории расставил симлинки на них. Должен предупредить, что симлинки могут
негативно сказаться на скорости работы <code>ls -l</code>, <code>ls --color</code> и прочих штук,
которые читают содержимое симлинка с целью выяснить, куда он ведёт — на моём
ноутбуке с 5400rpm HDD <code>ls -l --color</code> в директории с почти тремя сотнями файлов
отрабатывает около секунды. Впрочем, при последующих вызовах кеширование
сглаживает это время до нуля, так что ничего страшного я в этой ситуации не
вижу.</p>
<p>Ну ладно, комиттить файлы можно было и в простом Git — какие же именно
преимущества даёт нам git-annex? Давайте-ка попробуем клонировать наш
git-репозиторий куда-нибудь ещё, например, на внешний винчестер:</p>
<pre><code>$ cd /media/storejet
$ git clone /tmp/my-first-annex my-first-annex</code></pre>
<p>Инициализируем здесь annex под названием “storejet” и сообщим первому
репозиторию о втором:</p>
<pre><code>$ cd /media/storejet/my-first-annex
$ git annex init 'storejet'
$ git annex sync
(merging origin/git-annex into git-annex...)
(Recording state in git...)
commit  
ok
pull origin 
ok
push origin 
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 722 bytes | 0 bytes/s, done.
Total 8 (delta 3), reused 0 (delta 0)
To /tmp/my-first-annex
 * [new branch]      git-annex -&gt; synced/git-annex
 * [new branch]      master -&gt; synced/master
ok
$ # идём обратно в первый репозиторий
$ cd /tmp/my-first-annex 
$ git remote add storejet /media/storejet/my-first-annex
$ git annex sync
commit  
ok
pull storejet 
From /media/storejet/my-first-annex
 * [new branch]      git-annex  -&gt; storejet/git-annex
 * [new branch]      master     -&gt; storejet/master
 * [new branch]      synced/git-annex -&gt; storejet/synced/git-annex
 * [new branch]      synced/master -&gt; storejet/synced/master
ok
pull origin 
From /media/storejet/my-first-annex
   b10e6d9..6706944  git-annex  -&gt; origin/git-annex
ok</code></pre>
<p>Вот эта магия с <code>git remote add</code> — это такой способ объяснить репозиториям, как
они могут достучаться до остальных (второй уже знает о первом, потому что был
с него клонирован). Возможно, в будущем git-annex начнёт предоставлять какие-то
команды, которые эту магию от пользователя спрячут, но пока что работаем так.</p>
<p>Посмотрим на наш свежесозданный клон:</p>
<pre><code>$ ls -l avatar.jpg
lrwxrwxrwx 1 minoru minoru 192 Dec 14 06:59 avatar.jpg -&gt;
.git/annex/objects/7v/Q7/SHA256E-s7164--b442aaed464409198c19f37614dd6e7fd82ee658b897deaddf9a51b08c1aa19f.jpg/SHA256E-s7164--b442aaed464409198c19f37614dd6e7fd82ee658b897deaddf9a51b08c1aa19f.jpg
$ test -e avatar.jpg &amp;&amp; echo &quot;Link is ok&quot; || echo &quot;Broken link&quot;
Broken link</code></pre>
<p>Упс, а линк-то битый! (Как и все остальные в репозитории, кстати говоря). Это,
господа, вовсе не баг, это фича. Напомню, что файлы хранятся не в в самом
git-репозитории, а в <code>.git/annex/objects</code>, поэтому <code>git clone</code> их не копирует.
Это даёт вам возможность создавать так называемые partial checkouts — клоны
репозитория, в которых присутствуют не все файлы. В то же время, в каждом клоне
есть полный список симлинков на все существующие файлы, и их можно легко
получить, что мы сейчас и сделаем:</p>
<pre><code>$ git annex get avatar.jpg
get avatar.jpg (from origin...) ok
SHA256E-s7164--b442aaed464409198c19f37614dd6e7fd82ee658b897deaddf9a51b08c1aa19f.jpg
     7,164 100%    1.01MB/s    0:00:00 (xfr#1, to-chk=0/1)
ok
(Recording state in git...)
$ test -e avatar.jpg &amp;&amp; echo &quot;Link is ok&quot; || echo &quot;Broken link&quot;
Link is ok</code></pre>
<p>Что сейчас произошло? git-annex сообразил, что файла в текущем клоне нет, но он
есть в origin (это тот репозиторий, с которого был клонирован данный, то есть
наш “notebook”), после чего файл был скопирован в текущий клон. Как видно из
вывода, для копирования был использован rsync, что как бы намекает, что передача
файлов неплохо оптимизирована (передаётся только разница, есть докачка).</p>
<p>Вы всегда можете выяснить, где именно находится тот или иной файл:</p>
<pre><code>$ git annex whereis avatar.jpg
whereis avatar.jpg (2 copies) 
    31ef94bc-12d5-4af4-96a2-fb73bac12039 -- here (storejet)
    8644f457-86ec-4b15-bdc5-022ded68d4fa -- origin (notebook)
ok</code></pre>
<p>“storejet” и “notebook” взяты не с потолка — это те самые имена, которые мы
передавали параметром в <code>git annex init</code>. Как видите, они нужны для того, чтобы
вы могли легко понять, какой именно репозиторий скрывается за непонятным
численно-буквенным именем.</p>
<p>С помощью команд <code>get</code>, <code>copy</code> и <code>move</code> можно удобно рулить файлами (вывод
опущен):</p>
<pre><code># получить все файлы в этот репозиторий
$ git annex get .
# скопировать директорию с фотографиями обратно на notebook
$ git annex copy --to=notebook summer_camp_2012
# переместить всё со старого ноутбука сюда
$ git annex move --from=old_notebook .</code></pre>
<p>Уже существующие файлы не передаются, то есть вторая команда не передаст
ничего — фотографии с “notebook” никуда не девались, так что и копировать ничего
не нужно.</p>
<p>Последняя команда git-annex, без которой вам не удастся жить — это <code>git annex sync</code>. Я уже запускал её, когда говорил о клонировании репозитория, но не
объяснял, что она делает. А выполняет она очень важную операцию — синхронизирует
текущий annex со всеми остальными, подтягивая из них данные о новых файлах
и отправляя информацию о том, что поменялось в текущем. Для полной
синхронизации, насколько я понимаю, нужно два круга (то есть по очереди
выполнить <code>git annex sync</code> во всех репозиториях, а потом сделать то же самое ещё
раз), но на деле вам вряд ли понадобится быть насколько строгим
и последовательным. Лично мне с с ноутбуком, внешним винчестером и нетбуком
хватает синхронизации между ноутом и винтом по крону, плюс ручная синхронизация
нетбука, выполняемая время от времени по настроению. Git гарантирует, что ничего
не потеряется, просто если добавить или удалить какой-то файл, информация об
этом может не сразу добраться до всех репозиториев.</p>
<p>Ну всё, базовые функции я показал, свой первый annex мы создали — думаю, вы
готовы читать <a href="https://git-annex.branchable.com/walkthrough/" title="git-annex walkthrough">git-annex walkthrough</a> и идти внедрять git-annex
в свою повседневную жизнь. Впереди вас ждёт куча интересных фич, таких как
special remotes (возможность использовать Amazon Glassier, Flickr и прочие
в качестве удалённых репозиториев), unused content (удаление или перемещение
в архив старых версий файлов) и многое другое. Удачи!</p>]]></description>
    <pubDate>Sun, 15 Dec 2013 00:00:00 UT</pubDate>
    <guid>http://blog.debiania.in.ua/posts/2013-12-15-advertising-git-annex.html</guid>
    <dc:creator>Александр Батищев</dc:creator>
</item>
<item>
    <title>Одна причина хранить конфиги в системе контроля версий</title>
    <link>http://blog.debiania.in.ua/posts/2013-12-14-one-reason-to-put-configs-into-vcs.html</link>
    <description><![CDATA[<p>Пару дней назад я занимался тем, что читал <code>.vimrc</code> других программистов и тырил
оттуда понравившиеся мне настройки. Скопировав много всякого из
<a href="https://bitbucket.org/sjl/dotfiles/src/tip/vim/vimrc?at=default" title="BitBucket: sjl/dotfiles/source/vim/vimrc">конфига</a> небезызвестного <a href="http://stevelosh.com/" title="Steve Losh Website">Стива Лоша (Steve
Losh)</a>, я радовался жизни, пока вдруг не обнаружил, что <code>:edit</code>
(команда редактирования файла) больше не дополняет директории и мне приходится
писать их названия по памяти. Естественно, такие регрессии мне совсем не по
вкусу, так что нужно было как-то выяснить, какая же опция сломала любимую фичу.
Если бы мой <code>.vimrc</code> не находился под управлением системы контроля версий, мне
пришлось бы:</p>
<ul>
<li>подумать, какие именно опции могут влиять на автодополнение (учитывая, что
Vim — не самый простой редактор, и я всё ещё далёк от постижения всех его
возможностей и особенностей, здесь я вполне мог бы додуматься до чего-то
неправильного);</li>
<li>вспомнить, что я менял в последнее время (прошла всего пара дней, но я за это
время столько раз читал <code>:help</code> и столько смотрел на чужие конфиги, что
вспомнить сделанные мной правки было уже не так-то просто);</li>
<li>наконец, методом проб и ошибок выяснить, верны ли мои догадки, и всё починить.</li>
</ul>
<p>Но мой <code>.vimrc</code> таки лежит под Git, поэтому я сделал следующее:</p>
<pre><code>cd docs/git/dotfiles
git log
git bisect start
git bisect good 53273d7a0d6ab7f61a00ad1a43b1008eb189640f
git bisect bad
git bisect good
git bisect reset
git show acdc994b492bf5933e9c0374bf70e0ada69a2231
vim .vimrc
git add .vimrc
git ci -m'vim: fix directory completion for :e'
git push</code></pre>
<p>То есть вместо того, чтобы думать и вспоминать, я запустил <code>git bisect</code> и уже
через пару минут знал, какой именно коммит поломал мне автодополнение.</p>
<p>Когда я коммитил правки, мне было лень разбивать их на атомарные коммиты,
поэтому после bisect пришлось ещё немного поэкспериментировать, чтобы выяснить,
что всё ломается из-за опции <code>wildignore</code>, но это уже мелочи.</p>
<p>Между <code>cd</code> в репозитой и финальным <code>git push</code> прошло меньше десяти минут. Если
бы не Git, я бы потратил не меньше получаса. В общем, если у вас есть большие
и ценные конфиги, очень советую положить их под СКВ — морока минимальна,
а польза хоть и редка, но огромна.</p>
<p>Пользуясь случаем, рекламирую <a href="https://joeyh.name/code/etckeeper/" title="etckeeper website"><code>etckeeper</code></a> — программу, которая
будет хранить правки вашего <code>/etc</code> в Git, Mercurial, Darcs или Bazaar. Более
того, благодаря хукам для <code>aptitude</code> (а также <code>yum</code> и <code>pacman-g2</code>) всё
автоматизировано по самое не хочу: при любом <code>install</code>, <code>remove</code> или <code>purge</code>
программа сначала закоммитит любые незакоммиченные правки (если вы ленитесь
и сами этого не делаете), потом поставит/удалит пакеты и снова всё закоммитит
(на случай, если пакеты что-то поменяли). То есть вам делать ничего не нужно,
а возможность всё откатить и починить появляется. Приятно же!</p>]]></description>
    <pubDate>Sat, 14 Dec 2013 00:00:00 UT</pubDate>
    <guid>http://blog.debiania.in.ua/posts/2013-12-14-one-reason-to-put-configs-into-vcs.html</guid>
    <dc:creator>Александр Батищев</dc:creator>
</item>

    </channel>
</rss>
