Windows — жесткие ссылки на файлы в репозитории git часто ломаются

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


person Ayrton Massey    schedule 25.04.2017    source источник


Ответы (1)


Жесткие ссылки могут разорваться, если редактор открывает/создает файл как новый пустой файл при каждом сохранении. Меня не удивит, если Блокнот сделает это, потому что он считывает весь файл в память и не нуждается в исходном файле после загрузки файла.

Вы можете попробовать создать символическую ссылку на файл вместо жесткой ссылки в Windows.

person Anders    schedule 25.04.2017
comment
Я думаю, что пытался использовать обычную команду ссылки в Windows (cmd /c mklink C:\users\ayrton\.emacs C:\git\config\.emacs), но некоторые программы (например, emacs) жаловались, что не могут прочитать файлы. - person Ayrton Massey; 25.04.2017