Стратегия поддержки файлов точек для разных ОС (например, OSX и Ubuntu)

Я использую Git-репозиторий для поддержки моих файлов точек (vimrc, zshrc, tmux.conf и т. Д.). Поскольку у меня есть две разные операционные системы (OSX дома и Ubuntu на работе), я выделил ветку для каждой системы. Это приводит к различным версиям файлов точек, поскольку ОС не используют одни и те же инструменты / библиотеки для выполнения работы. Это усложняет ведение файлов точек для всех ветвей (расхождений файлов точек). Я думал, может ли быть лучшая стратегия для этого. Может быть, включить системные точечные файлы в другой файл и включить их в точечные файлы.

Другими словами, я ищу кроссплатформенную стратегию поддержки файлов точек для компьютеров с разными ОС.

Заранее благодарю за любую помощь

4 ответа

Решение

Для сценариев оболочки, таких как .zshrc, вы можете использовать переменную окружения или ответ на какую-либо команду, например uname. Но для точечных файлов без оболочки, таких как .vimrc, вы должны выполнять ручную работу по фиксации патчей из одной ветви в другую (из одной ОС в другую).

В дополнение к ответу Envite: я использую один общий .zshrc файл, в который включены все "переносимые" вещи (например, определения функций оболочки и т. д.). Кроме того, у меня есть дополнительный файл .zshrc-MACHINE_A и т.д. для каждого компьютера, где я использую общий конфиг. Здесь я определяю, например, PATH некоторые псевдонимы, отражающие текущие установленные программы и так далее.

Последняя часть моего общего .zshrc файл читает

# load $HOST specific setting

if [[ -f ~/.zshrc-$HOST ]]; then
   [[ ! -f ~/.zshrc-$HOST.zwc || ~/.zshrc-$HOST -nt ~/.zshrc-$HOST.zwc ]] && { zcompile ~/.zshrc-$HOST; print - compiled \~/.zshrc-$HOST. }
   source ~/.zshrc-$HOST
fi

В соответствии с man zshparam параметр $HOST содержит текущее имя хоста, следовательно, должно быть переносимым и сохранять внешний вызов программы. И каждый раз, когда в соответствии .zshrc-$HOST файл изменен, он будет скомпилирован (через zcompile ). Сборник служит цели (цитирую man zshbuiltins ):

(...) более быстрая автозагрузка функций и выполнение сценариев за счет исключения синтаксического анализа текста при чтении файлов.

Возможно, в настоящее время вы не заметите никакой разницы (?), Но это также не повредит. Btw. компиляции *.zwc файлы зависят от архитектуры и не могут быть обменами между различными системами.

Вот лучшее решение, с которым я столкнулся. Я рекомендую нажать на ссылку, а не читать об этом здесь:

ИДЕЯ

Я адаптировал идею @holman к символическим ссылкам на файлы, имя файла которых заканчивается на ".symlink", и вместо этого я использую символические ссылки на файлы, имя файла которых соответствует регулярному выражению \.(<os>-)?symlink$, Делая это, я могу иметь файлы, которые всегда являются символическими ссылками, и файлы, которые являются символическими ссылками только в определенной среде.

Например, в моем ~/.gitconfig Я включаю ~/.gitconfig_include, который содержит специфичные для ОС конфигурации.

[include]
    path = ~/.gitconfig_include

Затем у меня есть два файла.gitconfig_include: один для Linux и другой для Windows.

dotfiles
|-- git
    |-- .gitconfig.symlink
    |-- .gitconfig_include.linux-symlink
    |-- .gitconfig_include.windows-symlink

Это позволяет символической ссылке иметь одинаковое имя, но разные цели, в зависимости от ОС.

К сожалению, этой стратегии было недостаточно для удовлетворения всех требований к моим кроссплатформенным точечным файлам.

Плохое решение Vim на Windows

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

dotfiles
|-- vim
    |-- .vim.linux-symlink
    |-- vimfiles.windows-symlink

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

dotfiles
|-- vim
    |-- .vim
    |-- .vim.symlinks

Файл.vim.symlinks содержит имя символической ссылки для каждой среды.

linux: .vim
windows: vimfiles

Это позволяет символической ссылке иметь разные имена, но одну и ту же цель, в зависимости от ОС.

РАБОЧИЙ РЕШЕНИЕ

Если вы хотите проверить, как все закончилось, пожалуйста, посетите мои точечные файлы на GitHub.

Мое решение состоит в том, чтобы иметь отдельные репозитории для каждой машины.

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

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

Другие вопросы по тегам