Как сохранить «точечные файлы» под контролем версий?


30

Etckeeper - отличный инструмент для отслеживания изменений в ваших конфигурационных файлах /etc. Несколько ключевых вещей об этом действительно выделяются. Он может использоваться с различными VCS: git, mercurial, darcs или bzr. Он также выполняет автоматическую фиксацию ежедневно и всякий раз, когда вы устанавливаете, удаляете или обновляете пакет. Он также отслеживает права доступа к файлам и метаданные о владельцах и группах пользователей.

Я также хотел бы, чтобы мои "точечные файлы" в моем домашнем каталоге также находились под контролем версий, предпочтительно на базаре. Кто-нибудь знает, существует ли такой инструмент, как etckeeper для этой цели?

В худшем случае, я полагаю , что простой хрон работает bzr add && bzr ciодин или два раза в день вместе с добавлением ~/Documents, ~/Musicи т.д. к .bzrignore Anyone уже делал нечто подобное с помощью сценария?

Хотя я бы предпочел базар, другие варианты могут быть интересны.


4
Связанное обсуждение на Unix Stack Exchange: Советы по переводу ~ под контроль исходного кода . Он не отвечает на ваш вопрос, но, тем не менее, может предоставить полезную информацию.
Жиль "ТАК - перестань быть злым"

1
Есть много инструментов для этого сейчас. Смотрите dotfiles.github.io в разделе «Утилиты общего назначения для dotfile».
Робин Грин

@RobinGreen Если вы ответили правильно, я мог бы принять это. bzrэто, конечно, не путь в 2015 году.
Andrewsomething

Ответы:


7

Я не знал, есть ли что-нибудь, что могло бы сделать это, поэтому я собрал некоторый код для достижения именно того, что вы хотите, используя мой репозиторий здесь: http://github.com/robertmassaioli/config-files

У меня есть файл, который говорит, где все файлы принадлежат, и программа generate_links просто помещает их все туда. Если вы знаете, что делаете, и можете скомпилировать некоторый код на Haskell, то это действительно просто и легко. Хотя имейте в виду, что это действительно было сделано для моего личного использования.


3
+1 для Хаскелла! -1 за хаскель! смешно. нет, но на самом деле.
Дерек

Я слышу тебя. Я выбрал Haskell, потому что я изучаю его, он может или не может быть лучшим языком, подходящим для работы. :)
Роберт Массайоли

3

Ну, я продолжил и делал это вручную, пока не нашел лучшего решения. Так что я мог бы также объяснить, что я сделал.

Сначала я сделал bzr init ~, но следующее, что я сделал, было bzr ignore "*". Я решил, что не хочу держать все это под контролем версий. Это просто не стоило того, особенно если учесть, что есть некоторые вещи, которые вы действительно не должны хранить в vcs, как ваши ключи. Таким образом, я тогда имел к bzr addопределенным файлам, которые я хотел. Вы также можете добавить исключения .bzrignore. Здесь также полезны регулярные выражения Python. Я держу это довольно тонким пока. Если все пойдет хорошо, я мог бы добавить все ~/.configи ~/.gconfтоже.

Я также написал быстрый скрипт, который я запускаю как задание cron. Он проверяет, изменились ли файлы, и если это так, делает автоматическую фиксацию:

#! /bin/bash

set -e

TIME=$(date)
STATUS=$(bzr status)

if [ -n "$STATUS" ]; then
    if [ -n "$1" ]; then
         bzr ci ~ -m "$1"
    else
        bzr ci ~ -m "Automatic commit on $TIME"
    fi
fi

exit

Я сам выбрал ответ, когда впервые опубликовал это, но решил отменить это. Это, конечно, не лучший ответ на этот вопрос в 2015 году.
andrewsomething

2

Я превратил весь мой ~каталог в хранилище Bazaar. Хранение метаданных не является проблемой для файлов в домашнем каталоге: все принадлежит одной и той же учетной записи и группе и bzrуже сохраняет бит выполнения.

Я вручную добавляю "интересные" файлы к нему (я не хочу, например, чтобы моя музыкальная коллекция или кеш Firefox находились под контролем версий), но если вы хотите автоматизировать это с помощью скрипта, я думаю, что это простое решение выполнение bzr add && bzr ciна выбранных каталогах или на выходе findкоманды просто сделает работу.


2

Я храню свои zsh и vim файлы в git, помещаю на github, в разные репозитории:

для zsh, например, я создал «.zsh» и поместил в него zshrc и zshenv, а также скрипт для связывания zshrc с ~ / .zshrc и zshenv с ~ / .zshenv, что-то вроде этого.

while true
do
read -p "do you want to link zshenv to ~/.zshenv (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshenv ~/.zshenv; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

while true
do
read -p "do you want to link zshrc to ~/.zshrc (Y/N)" yn
case $yn in
    [Yy]*) ln -s ~/.zsh/zshrc ~/.zshrc; break;;
    [Nn]*) break;;
    *) echo "please answer yes or no";;
esac
done

так что я делаю

git clone git://git@github.com:tshirtman/.zsh
cd .zsh
./init.sh

для .vim это почти то же самое, за исключением того, что я использую субмодули для плагинов с патогеном, поэтому я добавил это в init.sh

git submodule init
git submodule update

и когда я хочу добавить плагин vim, я делаю

git submodule add git://github.com/nathanaelkane/vim-indent-guides.git bundle/vim-indent-guides

например.

Хорошо, это потребовало бы слишком много работы, если у вас есть несколько точек, которыми вы хотите управлять, но ничто не мешает вам поместить их все в один каталог или разделить по действиям (включено для всех графических редакторов, одно для веб-активности ...) или около того. во всяком случае, это то, что я сделал, так что только мои два цента :).


1

Я использую решение, которое не является автоматическим, как etckeeper (я должен сделать коммит вручную), но оно хорошо сработало для меня. Это не так развито, как мне нравится, но работает.

Я написал свою собственную утилиту, которая похожа на GNU Stow , так как stow делал не все, что хотел. Я называю это Stow in Home . Когда запускается, он ищет каталог с именем "HOME". Затем он берет все в этом каталоге и символически связывает его с соответствующим местоположением в $ HOME, создавая каталоги по мере необходимости. Он также будет переводить имена файлов - если файл начинается с «_», он будет заменен на «.». Я сделал это, потому что лучше редактировать мои точечные файлы, когда они не скрыты (по умолчанию их можно увидеть в списках каталогов). Тогда это поместило бы их в имя, которое их приложение ожидает.

Итак, у меня есть несколько репозиториев git для моей конфигурации. Я помещаю только точечные файлы, которые я лично редактирую в них. Преимущество этого в том, что у меня может быть репозиторий для файлов точек, который я могу поделиться с другими (например, моей конфигурацией Emacs) и один для других, которые являются частными (скажем, моя конфигурация ssh, с именами хостов и тому подобное для работы). Символьная ссылка ставит с stow-in-home, все расставляет на свои места, но контроль источника для каждого из них может быть отдельным.

Это хорошо сработало для меня. На самом деле нет причин, по которым я не мог настроить что-то, чтобы автоматически делать коммиты. Или переместите все точечные файлы в соответствующие репозитории и по-прежнему используйте хранилище дома. Но так я поступил.


0

Не можете ли вы добавить dot filesрепозиторий, используемый в Etckeeper?


1
Как бы я это сделал? символическая ссылка их все куда-то /etc?
Andrewsomething

Ну что ж ... это один из вариантов
txwikinger

0

Я сделал это, скопировав все мои точечные файлы, которые я хотел бы сохранить под контролем исходного кода, в папку с именем «точечные файлы» в моем / home / каталоге. Конечно, это означает сохранение дубликатов и копирование туда-сюда при необходимости, но я считаю, что это самое простое решение для меня.


1
вместо того, чтобы управлять дубликатами, не могли бы вы просто создать символические ссылки на ваши точечные файлы?
Райан

Я думаю, что вы, конечно, можете!
Дерек

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.