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 продолжать хранить символические ссылки или найти способ игнорировать символические ссылки?
3 ответов:
Git может обрабатывать символические ссылки просто отлично, пока операционная система, используемая всеми разработчиками, поддерживает их. Поскольку вы зависите от наличия этих символических ссылок, я буду считать, что все ваши среды разработки поддерживают символические ссылки.
чтобы решить, должно ли что-то быть включено в ваш репозиторий git или нет (символическая ссылка или иначе), рассмотрите следующее:
- это файл, созданный каким-либо инструментом или другим процессом в репозитории? Если это так, то лучше игнорировать его и пусть каждый пользователь создает файл, так что они всегда будут иметь последнюю версию.
- является ли файл специфичным для конкретной среды разработки пользователя или используется во всех средах? Если это причуда среды конкретного пользователя, например конфигурация для игнорирования файлов резервных копий Emacs, она не относится к РЕПО. Если это то, что нужно всем разработчикам, и / или что-то, что необходимо для создания приложения для производства, оно должно идти в хранилище.
в вашем случае кажется, что символические ссылки не генерируются, и они необходимы во всех средах, поэтому их размещение в репозитории должно быть прекрасным.
однако при их создании обязательно создавайте их как относительные символические ссылки, а не абсолютные, чтобы они работали независимо от того, где клонируется репозиторий. Самый простой способ сделать это-изменить каталог в каталог модулей и создать символическую ссылку из там:
cd App/Code/Modules ln -s "../../../Vendors/Module A" "Module A"
git хранит символическую ссылку, как и любой другой файл в своем контроле версий-за исключением символической ссылки, он будет хранить только информацию о пути, на который он ссылается, и тип файла как символическая ссылка вместо обычного файла.
Если символическая ссылка указывает на каталог, git не сохраняет содержимое в каталоге с символической ссылкой.
поэтому не должно быть никакого вреда в сохранении ссылки версионный под Git для вашего случая.
еще одна вещь, вы должны быть зная о том, что с символическими ссылками, git будет только воссоздавать символические ссылки на новом клоне, а не на файл или каталог, на который он указывает. Есть вероятность, что символический путь будет отсутствовать (скажем, при использовании абсолютных путей).
@Tuxdude не может согласиться с вами вообще с "...тогда ты делаешь что-то не так". Например, если вам нужно поместить папку мультимедиа на другой диск на веб-сервере или даже в NFS, то вы должны поместить его вне системы управления версиями. Таким образом, содержимое внутри папки symlinked media не будет доступно через управление версиями, как вы объяснили. Но это сценарий, где вы должны сделать это так. И это действительно боль в б... Мой сценарий еще более сложный (я не буду вдаваться в подробности подробно), то, что я на самом деле ищу, - это добавить подпапки символической папки в управление версиями, но не ее содержимое, но мне нужно иметь возможность игнорировать любые изменения самого типа подпапки в git. Как пример, базовая структура:
- app / media / bla
- app / media / blubb
Мне нужны эти папки в Git versioning, без его содержимого.
на веб-сервере (та же версия) эти папки выглядят так это (ссылки):
- app / media / bla = > где-то совсем в другом месте
- app / media / blubb = > где-то совсем в другом месте
разработчики должны иметь в своей локальной среде только исходную версионную структуру, как описано в первом шаге (без символических ссылок). Но веб-сервер имеет символические ссылки на различные системы NFS.
Если у кого-то есть идея, как решить эту проблему, я был бы очень признателен, потому что я не нашел никакого решения для этого еще.
единственный способ, которым я делаю это сейчас, - это иметь строитель, который создает правильную / другую структуру для локальных сред, а серверы и подпапки мультимедиа в настоящее время полностью игнорируются gitignore. Но это может быть иногда сложно / трудно поддерживать.
Comments