5

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

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

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

4 ответа4

1

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

1

В дополнение к ответу 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 зависят от архитектуры и не могут быть обменены между различными системами.

0

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

ИДЕЯ

Я адаптировал идею @ 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 в Windows. Это означает, что, если бы я хотел сохранить ту же стратегию, мне пришлось бы дублировать папку с файлами - что я не хотел делать по понятным причинам.

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

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

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

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

linux: .vim
windows: vimfiles

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

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

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

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .