2013-03-17 2 views
59

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

I имеет следующую структуру:

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 хранить символические ссылки или найти способ игнорировать символические ссылки?

+0

hm Я сделал это относительно, и он не работает на github :(можете вы мне помочь? Https://github.com/lingohub/Example-Resource-Files/blob/master/AngularJS/example.en.json –

ответ

117

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

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

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

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

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

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

+1 для highliting «относительных символических ссылок» –

+0

hm Я сделал это относительным, и он не работает на github :(вы можете мне помочь? Https://github.com/lingohub/Example-Resource-Files/blob/master/ AngularJS/example.en.json –

+0

Означает ли это, что если я внесу какие-либо изменения в Vendors/Module A и нажму на Git, Git автоматически обновит содержимое App/Code/Modules/Module A? – HasnainMamdani

8

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

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

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

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

+0

Есть ли способ добавить файлы, которые находятся в каталоге symlink? – kraftydevil

+0

@kraftydevil - git позволит вам добавлять файлы в каталог symlink только до тех пор, пока целевой каталог самой символической ссылки находится под управлением git версии. В противном случае git не будет (и не должен) версии содержимого каталога symlink.Если вы пытаетесь загрузить файлы в директорию symlink вне основного каталога репозитория git, то вы делаете что-то неправильно. Возможно, вы захотите проверить 'git subodules '(или лучше' git subtrees') – Tuxdude

+0

Я помещаю свой экземпляр Jenkins под контроль источника. Я хотел бы сохранить последнее конструктивное содержимое для каждой работы. ook у него немного позже для большего объяснения. – kraftydevil

1

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

  • приложения/СМИ/л
  • приложения/СМИ/blubb

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

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

  • приложение/СМИ/бла => где-то совсем другое
  • приложение/СМИ/blubb => где-то совсем другое дело

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

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

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

+0

Это распространенная проблема, и, как я уже говорил, она не связана с управлением версиями. Одним из решений является создание сценария инициализации для настройки символических ссылок на основе целевой среды. Сценарий инициализации должен запускаться в bootstra p ваша настройка сразу после 'git clone'. Добавьте скрипт инициализации в управление версиями git.BTW 'git' не будет содержать пустые каталоги версий, git только файлы версий и знает путь. Это будет использоваться для воссоздания структуры каталогов при запуске любой из команд 'git'. – Tuxdude

+0

Спасибо за ваше объяснение, это почти так же, как я делаю это на моих текущих настройках. Я просто подумал, что, возможно, был более «удобный» способ. Если git будет иметь какой-то флаг дифференциации между нормальными файлами и символическими ссылками в правилах gitignore и т. Д., Тогда некоторые вещи будут, по крайней мере, немного проще. Вот почему я думаю, что есть отношение к «контролю версий», оно может быть реализовано как «новая функция»/через запрос функции, есть также и другие вещи, которые мне не хватает в git, когда дело доходит до более сложных сценарии. – ioCron

+0

Я могу сказать, почему git рассматривает символические ссылки таким образом. Для git символическая ссылка эквивалентна текстовому файлу, содержимое которого представляет цель символической ссылки. Эта цель добавляется как часть истории git, когда вы добавляете символическую ссылку в git. – Tuxdude

Смежные вопросы