Felix — система синхронизации конфигов

Preview:

Citation preview

Слайддля настройки

проектора

Иван Бессарабов

разработчик

http://friendfeed.com/bessarabov

ivan@bessarabov.ru

1. Я начал выступать в роли R 2. Я столкнулся с проблемой P 3. У меня возникли такие-то вопросы Q1 4. В ходе работы на часть вопросов Q2 из

Q1 я получил работающие ответы A 5. В ходе работы и получения ответов A

возникли новые вопросы Q3, которые я пока не могу решить

6. Помогите мне найти ответы на вопросы Q1-Q2 и Q3

Денис предложил следующие темы для докладов

1. Я начал выступать в роли R 2. Я столкнулся с проблемой P 3. У меня возникли такие-то вопросы Q1 4. В ходе работы на часть вопросов Q2 из

Q1 я получил работающие ответы A 5. В ходе работы и получения ответов A

возникли новые вопросы Q3, которые я пока не могу решить

6. Помогите мне найти ответы на вопросы Q1-Q2 и Q3

Я выбрал для рассказа эту тему

Р

У меня есть Problem

РS

Но кроме Problem у меня еще есть и Solution

Моя проблема заключается в том, что у меня много компьютеров на которых я работаю. Рабочий компьютер.

Домашний десктоп

Домашний ноутбук

И с десяток серверов

Я много времени работаю в консоли. И мне бы хотелось чтобы рабочее окружение в консолина всех машинах было как можно более одинаковое.

$ ..$ cd ..

$ ..-bash: ..: command not found

Например, я предпочитаю вводить “..” вместо “cd ..”, но если не указать дополнительные настройки,то это работать не будет.

$ ..$ cd ..

А таких штук у меня вагон и маленькая тележка. Вот такая тележка. И я хочу чтобы если у меня появиласьКакая-то новая команда, то она сразу же работала на всех машинах.

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

/home/bessarabov/

/Users/bessarabov/

На линуксе и на маке все файлы пользователя находятся в одной папке.

~ . |-- bin |-- Desktop |-- Documents | |-- screen_shots | `-- keynotes |-- Dropbox |-- git |-- .vim ← |-- some_file.txt ← |-- .bashrc ← |-- .gitconfig ← `-- .vimrc ←

Для этой папки есть удобное сокращение – символ тильда. Все настройки хранятсяв текстовых файлах. Т.е. задача заключается в том чтобы синхронизировать некоторые файлы.

~ . |-- bin ← |-- Desktop |-- Documents | |-- screen_shots | `-- keynotes |-- Dropbox |-- git |-- .vim |-- some_file.txt |-- .bashrc |-- .gitconfig `-- .vimrc

В процессе решения задачи я еще пришел к том что удобно синхронизировать не толькоконфигурационные файлы, но и некоторые другие файлы,

После того как задача был сформулирована появилась необходимость как-то назвать проект.Первое что пришло в голову это название felix. Такое название и оставил.

~ . |-- .git ← |-- bin |-- Desktop |-- Documents | |-- screen_shots | `-- keynotes |-- Dropbox |-- git |-- .vim |-- some_file.txt |-- .gitignore ← |-- .bashrc |-- .gitconfig `-- .vimrc

Первый подход к решению. Просто в домашней папке создать рабочую копию системы контроля версий.Все файлы и папки, которые нужно синхронизировать – комитить, остальные игнорировать.

Получилась вот такая очень простоая система. Все машины получают конфигурационные файлы через один репозиторий.

Git

Через некоторое вермя работы обнаружились некоторые неудобства, когда домашняя папкаявляется рабочией копией. 1) достаточно часто появлялись новые файлы, поэтому часто приходилось

обновлять .gitignore

~ . |-- .git |-- git | |-- bem-bl | |-- Mock-Person | `-- rakudo |-- .vim |-- some_file.txt |-- .gitignore ← |-- .bashrc |-- .gitconfig `-- .vimrc

2) В домашней паке у меня есть рабочие копии в папке git. Несколько раз при создании нового репозитория ~/git/new_project я забывал сделать git init и комитил все в репозитарий felix, а не в new_project

~ . |-- .git |-- git ← | |-- bem-bl ← | |-- Mock-Person ← | |-- new_project ← | `-- rakudo ← |-- .vim |-- some_file.txt |-- .gitignore |-- .bashrc |-- .gitconfig `-- .vimrc

v2

В конце концов эти недостатки меня окончательно достали, а тут как раз Слава Матюхин рассказал как можно решить эту проблему.

~ . |-- felix | |-- .vim | |-- .bashrc | `-- .gitconfig |-- .vim |-- .bashrc `-- .gitconfig

Решение очень простое - создать рабочую копию не в домашней папке, а в ~/felix.

А в домашней папке должны лежать ссылки на файлы в ~/felix. Это решает обе проблемы:

1) В рабочей копии нет лишних файлов, поэтому не нужно мучатся с .gitignore2) так как нет репозиториев на более глубоком уровне фаловой системы, то нет и проблем с комитами

~ . |-- felix | |-- .vim | |-- .bashrc | `-- .gitconfig |-- .vim |-- .bashrc `-- .gitconfig

На самом деле структура файлов немного другая. Еще есть скрипт, который синхронизирует файлы + все

файлы, которые нужно синхронизировать находятся в подпапке tilde

~ . |-- felix | |-- create_symlinks.pl | `-- tilde | |-- .vim | |-- .bashrc | `-- .gitconfig |-- .vim |-- .bashrc `-- .gitconfig

https://github.com/bessarabov/felix

Cкрипт для синхронизации файлов сегодня появится на github

И еще два слова о том как я построил работу. Изначально я пытался работать в git с ветками – т.е. настройки для каждого типа компьютеров жили в одной ветки, но оказалось, что это сложно и не удобно поддерживать.

Поэтому сейчас я уже почти полностью перешел на работу в одной ветке, а различия между машинами релазизую if-ами.

Profit1. На всех машинах

одинаковые настройки2. Бекап настроек

В итоге мне удалось решить ту задачу, которая у меня возникла. “На сдачу” появился дополнительный профит в виде бекапа (git сервер же бекапится, да?). Первый подход к задаче у меня был немного менее года назад, а

версия 2 у меня работает около 5 месяцев.

Спасибо!

http://friendfeed.com/bessarabov

ivan@bessarabov.ru

Recommended