Git - как обращаться с символическими ссылками

Каков правильный способ обработки символических ссылок в git?

У меня есть следующая структура:

Vendors
  Module A
  Module B
  Module C
App
 Code
   Modules
     Core Module 1
     Core Module 2
     Module A (symlinked to vendors)
     Module B (symlinked to vendors)
     Module C (symlinked to vendors)

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

Важно отметить, что как каталог поставщика, так и каталог основного приложения оба версируются в одном хранилище.

Следовательно, должен ли я позволить git хранить символические ссылки или найти способ игнорировать символические ссылки?

Ответ 1

Git может отлично справляться с символическими ссылками, пока их поддерживает операционная система, используемая всеми разработчиками. Поскольку вы зависите от наличия этих символических ссылок, я буду считать, что ваши среды разработки поддерживают символические ссылки.

Чтобы решить, должно ли быть что-то включено в репозиторий git или нет (символическая ссылка или иначе), рассмотрите следующее:

  • Это файл, созданный каким-либо инструментом или другим процессом в репозитории? Если это так, лучше проигнорировать его и позволить каждому пользователю сгенерировать файл, чтобы у них всегда была последняя версия.
  • Является ли файл специфичным для конкретной среды разработки для пользователя или для среды, которая используется во всех средах? Если это причуда конкретной пользовательской среды, например, конфигурация для игнорирования файлов резервных копий Emacs, она не принадлежит репо. Если вам понадобится что-то, что потребуется всем разработчикам, и/или что-то, что необходимо для создания приложения для производства, оно должно войти в репозиторий.

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

Однако при их создании обязательно создавайте их как относительные символические ссылки, а не абсолютные символические ссылки, чтобы они работали независимо от того, где клонируется репозиторий. Самый простой способ сделать это - изменить каталог в каталог модулей и создать там символическую ссылку:

cd App/Code/Modules
ln -s "../../../Vendors/Module A" "Module A"

Ответ 2

Git хранит символическую ссылку, как и любой другой файл в своем управлении версиями - за исключением символической ссылки, она будет хранить информацию о пути, к которому она привязана, и тип файла как символическая ссылка, а не обычный файл.

Если символическая ссылка указывает на каталог, git не сохраняет содержимое в символической директории.

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

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

Ответ 3

@Tuxdude Не могу согласиться с вами вообще с "... тогда вы делаете что-то не так". В качестве примера, если вам нужно разместить медиа-папку на другом диске на веб-сервере или даже в NFS, вам придется выставить его вне контроля версий. Таким образом, содержимое внутри папки с символическими носителями не будет доступно через управление версиями, как вы объяснили. Но это сценарий, где вы должны это делать. И это действительно боль в b... Мой сценарий еще сложнее (я не буду вдаваться в подробности), то, что я действительно ищу, - это добавить вложенные папки символической папки в управление версиями, но не ее содержимое, но Мне нужно иметь опцию, где я могу игнорировать любые изменения самого типа подпапки в git. Например, базовая структура:

  • app/media/bla
  • приложение/СМИ/blubb

Мне нужны эти папки в версии git, без ее содержимого.

На веб-сервере (такое же управление версиями) эти папки выглядят так (символические ссылки):

  • app/media/bla = > где-то совсем другое
  • app/media/blubb = > где-то полностью еще раз

Dev должен иметь в своей локальной среде только исходную структуру, описанную на первом этапе (без символических ссылок). Но веб-сервер имеет символические ссылки на разные системы NFS.

Если у кого-то есть идея, как это решить, я бы очень признателен за это, потому что пока не нашел решения для этого.

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