2013-06-13 3 views
8

Я храню файлы конфигурации (~/.bashrc, ~/.emacs, ~/emacs и т. Д.) В git. То, как я настроил это, было просто добавить репозиторий git в домашний каталог.Эффективный способ управления репозиторием git для локальных файлов конфигурации

Я нашел этот подход имеет некоторые проблемы:

  • git gui принимает навсегда, потому что он рекурсивно просматривает весь домашний каталог.
  • Я иногда случайно добавляю файлы в конфигурационное репо, которое должно перейти на новое репо (я создаю новый проект, скажем в ~/projects/foo, забудьте, что он еще не инициализирован инициализированным git-репо, и выполните git add bar.xyz в каталоге foo. Это приводит к добавлению файла в конфигурацию repo).

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

Есть ли лучший подход, или это стандартный способ хранения локальных файлов конфигурации в git?

+1

Если вы делаете это, чтобы синхронизировать файлы между машинами, я бы просто использовал Dropbox. Если вы хотите 'git', настройка будет аналогичной: если у вас есть какой-то каталог с источниками где-то (например,' ~/Dropbox/home', и есть скелет '~/.bashrc', что источники' ~/Dropbox/home/.bashrc' и symlinks других файлов в '~'. – millimoose

+0

Для этого есть много инструментов. См. https://dotfiles.github.io/ в разделе «Утилиты общего назначения для точечного копирования». –

ответ

3

Я использую git repo для управления dotfiles. Он содержит:

  1. справочник dotfiles, содержащий фактические dotfiles/dotdirs, которые я хочу отслеживать.
  2. сценарий оболочки, чтобы создать символическую ссылку dotfiles/.* в $HOME, как

    for dotfile in dotfiles/.* ; do 
        case $(basename $dotfile) in 
        .) 
         ;; 
        ..) 
         ;; 
        *) 
         ln -sv $(realpath dotfile) $HOME/$(basename $dotfile) 
         ;; 
        esac 
    done 
    

Сценарий вручную запущено после того, как я добавить что-то новое в dotfiles (обычно путем перемещения dotfile в репо), или в новом и чистом $HOME.

Репо может находиться где угодно. У меня есть клон в $HOME на каждом хосте, который я использую.

Таким образом, у меня есть намного меньшее и не вложенное дерево работы, чтобы выборочно отслеживать dotfiles.

p.s. Вы можете добавить такие записи, как dotfiles/.config/*, в .gitignore, он содержит много файлов, которые я не хочу отслеживать.

+2

Мне нравится эта идея, но некоторые из команд этого сценария оболочки недоступны по умолчанию (например: OSX не имеет реальной траектории). –

+0

Вопрос: Я делаю это, но мне интересно, как вы обрабатываете специфические для машины варианты? Например, на моем домашнем компьютере Я хочу, чтобы моя электронная почта gitconfig была моей личной электронной почтой, но на моем рабочем компьютере я хочу, чтобы это была моя электронная почта и т. Д. В настоящее время я обрабатываю это, копируя определенные файлы из dotfiles в мой '' '$ HOME''', но это становится кошмаром обслуживания (если я хочу добавить новый псевдоним git, я должен обновить два файла .gitconfig и т. д.). –

+0

@AdamParkin Параметры для машины также меняют ('.asoundrc'). Что касается автора git, я использую zsh 'cd' hook для установки автора на репо из пути, см. [This gist] (https://gist.github.com/jokester/208147bf83f155e1f39c6734a108feaa). Не пробовал, но глобальные git-крючки могут делать что-то подобное. – Jokester

3

Я сохраняю свои точечные файлы в репозитории Git, как и вы, мой домашний каталог является хранилищем Git.

  • git gui: Я редко использую его, так что я не совсем уверен, как его производительность влияет на множество неотслеживаемых файлов. Однако у меня есть файл ~/.gitignore, который просто содержит *. Возможно, игнорирование всего ускорит git gui для вас.

  • Accidentally добавление файлов: Создание ~/.gitignore файла, который просто содержит * также решает проблему случайного добавления файла в репозиторий, когда вы точечные файлов забудьте инициализировать новый репозиторий проекта (он будет сказать вам использовать -f если вы действительно хочу добавить файл).

  • У меня никогда не было проблем с вложенными репозиториями.

Некоторые примечания:

  • Основная причина, почему я поставил мой ~/.gitignore в * так, что git status не показывает все файлы в моем домашнем каталоге. Это заставляет меня использовать git add -f все время, что немного раздражает, но не такое большое дело.

  • Получить значение, используя git clean -dx вместо git clean -dxf. Вам нужно будет помнить, чтобы запускать git config clean.requireForce false в новых репозиториях проекта, но это предотвратит случайное удаление всех ваших файлов в вашем домашнем каталоге, если вы не находитесь в каталоге, в котором вы думаете. Вы находитесь в каталоге, который, по вашему мнению, вы находитесь.

  • Git иногда решает сбросить права доступа к файлам. Это может быть плохо, если вы хотите хранить конфиденциальные файлы (chmod og-rwx) в своем репозитории Git. Я обрабатываю это с помощью крюка post-checkout, который исправляет разрешения определенных файлов и каталогов (например, ~/.ssh/authorized_keys).

Смежные вопросы