Стратегия поддержки файлов точек для разных ОС (например, 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 не следует символическим ссылкам (они просто хранят их), а жесткие ссылки также не работают , я написал скрипт, который содержит список файлов, которые одинаковы на обеих машинах. После внесения изменений в одном из репозиториев я запускаю скрипт.
Если он обнаруживает (моя вычислительная контрольная сумма), что какие-либо общие файлы изменились в этом хранилище, он копирует их в другое хранилище. Затем я перехожу в этот репозиторий и фиксирую изменения там хорошо.