Я поддерживаю частный репозиторий Git со всеми моими конфигурациями и файлами точек (.bashrc
, profile.ps1
, .emacs
и т. д.).
В Windows этот репозиторий хранится под C:\git\config
. Большинство приложений ожидают, что файлы будут находиться где-то еще, поэтому я добавил жесткие ссылки между репозиторием и ожидаемыми местоположениями.
Пример
В Linux .emacs
находится в ~/git/config/.emacs
, но emacs ожидает, что он будет в ~/.emacs
. Я бегу:
$ sudo ln -s ~/git/config/.emacs ~/.emacs
В Windows мой .emacs
находится в C:\git\config\.emacs
, но emacs ожидает, что он будет в C:\users\ayrton\.emacs
. Я бегу:
PS> cmd /c mklink /H C:\users\ayrton\.emacs C:\git\config\.emacs
Проблема
В Linux это работает нормально: когда я обновляю исходный файл, содержимое ссылки обновляется, и все остается синхронизированным.
В Windows через какое-то время ссылки разрываются, и файлы перестают синхронизироваться (содержимое файлов отличается).
Почему ссылки не работают в Windows? Есть ли альтернативное решение?
Я видел это сообщение StackOverflow: Невозможно жестко связать файл gitconfig
Итак, я наконец нашел решение, которое сочетает в себе лучшее из обоих: поместите репозиторий в подкаталог и вместо символических ссылок добавьте параметр конфигурации «core.worktree» в качестве вашего домашнего каталога. Теперь, когда вы находитесь в своем домашнем каталоге, вы не находитесь в репозитории git (так что первая проблема ушла), и вам не нужно иметь дело с хрупкими символическими ссылками, как во втором случае. У вас все еще есть небольшая проблема с исключением путей, которые вы не хотите версионировать (например, трюк «*» в «.git/info/exclude»), но это не ново.
Проблема здесь в том, что ожидаемые местоположения отличаются в Windows и Linux. Например, VSCode ожидает, что пользовательские настройки будут в:
- Линукс:
$HOME/.config/Code/User/settings.json
- Окна:
%APPDATA%\Code\User\settings.json
В идеале я хотел бы, чтобы мой репозиторий был независимым от платформы. Если использовать подход core.worktree
(например, сделать core.worktree
равным /
или C:\
, а затем исключить все, кроме определенных файлов), мне придется поддерживать две копии некоторых файлов конфигурации, когда их абсолютные пути различаются в разных операционных системах.