LINUX.ORG.RU

GIT как тянуть определенные каталоги

 


0

1

привет,

как можно настроить git стягивать только определенные каталоги с репозитария. Возможно через какие то теги.

Суть в том, что в репозитарии раскиданы сценарии, которые сервера должны подтягивать и тем самым актуализировать локальные копии.

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

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

Если через ветки, то же придётся править в каждой ветке.

Спасибо.

Часть коммита вытянуть нельзя. Можно только сделать sparse checkout, но он структуру каталогов сохранит.

А вообще я не понял:

GIT как тянуть определенные каталоги

но

по каталогам для каждого сервера раскидывать сценарии не хочется

Похоже на противоречие.

т.к. придётся править в каждом каталоге и будет много копий.

Символические ссылки?

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

извиняюсь за сумбурный вопрос

В общем в чем задача. В репозитории хранятся сценарии, которое администратор добавляет/изменяет на своем хосте.

Эти сценарии должны автоматически подгружаться на сервера. Но хотелось бы подгружать только те сценарии, которые нужны для конкретного сервера. Т.е. не весь проект, не все сценарии, а только определенные для сервера А, определенные для сервера Б и так далее.

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

создавать для каждого сервера проект, то же не вариант. Например, есть какие то общие сценарии (одинаковы) и они должны быть на всех сервера, в этом случае если нужно что то поменять, то придётся поменять в каждом из сценариев в каждом из проектов.

den_v_pasternak
() автор топика
Ответ на: комментарий от xaizek

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

den_v_pasternak
() автор топика
Ответ на: комментарий от den_v_pasternak

Так.. Сейчас еще непонятнее стало.

Гитом стянуть определенные папки можно примерно так:

git fetch octocat
git checkout octocat/master -- images/
git checkout octocat/master -- javascripts/

причем в конце это pathspec с поддержкой звездочек, вложенности и т.д

Вопрос тогда зачем тут гит, контроль версий? Сервера откатывать вряд ли будут. Может им просто ссылки на файлы дать. А самим обновлять их.

Что кроме подзатыльника помешает скачать лишнее? Вы же доступ ко всему даете.

Кто решает и меняет решения что нужно: сервера или центральное хранилище?

a1000
()
Ответ на: комментарий от micronekodesu

Да, git pull, может как то через токен. если можно указать какой то файл с перечнем файлов, наверное такой вариант то же подходит. Только придется следить за этими файлами.

den_v_pasternak
() автор топика
Ответ на: комментарий от den_v_pasternak

Если я правильно понимаю что вы хотите делать то вам нужен оркестратор (ansible\puppet\chef и т.д.). Как минимум потому что решение о том, когда и какие обновления накатывать и управлять всякими там расписаниями удобнее из одной точки, а не с каждого сервера. Плюс если для ваших «сценариев» требуется перезапуск приложений, который с ними должны работать, вы вынуждены накручивать дополнительные костыли. И опять же велика вероятность что сервер «решит» обновиться в тот момент, когда вам меньше всего это будет нужно.

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

Если вам нужно именно сервером забирать данные - клонируйте репу с --depth 1 --no-checkout --filter=blob:none и потом делайте checkout\sparse-checkout только нужных данных. Другой вариант - ваш «сервер гита» скорее всего может отдавать контент и через какой-нибудь http, забирайте через него только нужные файлы.

UPD. А, ну или перейдите на svn, там забирать определенный файл\каталог можно гораздо проще.

micronekodesu ★★★
()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Спасибо, а можно ссылку почитать по этому поводу: «В том числе вы решите вопрос с «копиями» для каждого сервера - держите в репе шаблон и подставляете в него те значения, которые нужны конкретному серверу. Проще редактировать и сопровождать.»

den_v_pasternak
() автор топика
Ответ на: комментарий от micronekodesu

Спасибо, а этот вариант как провернуть? :) «Другой вариант - ваш «сервер гита» скорее всего может отдавать контент и через какой-нибудь http, забирайте через него только нужные файлы.»

«checkout\sparse-checkout только нужных данных.»

den_v_pasternak
() автор топика
Ответ на: комментарий от den_v_pasternak

Как хочешь - так и проворачивай.

Посмотри на gitlab для http API.

TheKnight ★★★
()
Последнее исправление: TheKnight (всего исправлений: 1)

на gitlab выкачка подпапки работала вот так:

git archive --remote=ssh://git@gitlab.host.com/group/repo.git HEAD folder/subfolder | tar xvf - --strip-components=2

Скорее всего вместо HEAD можно указать любую ветку

GPFault ★★
()

Реорганизуй репо в группу репозиториев, обьедени через топовый проект + сабмодули, и тогда стягивай поштучно репки. Ну а вообще то что ты хочешь сделать - главный антипатерн почему собственно Git и появился(что бы иметь снепшот целого дерева а не пофайлово).

То что ты хочешь можно реализовать и скриптово

git clone --bare URL repka
cd repka
for fname in file1.sh file2.sh file3.sh; do
  git show remotebranchname:${fname} > ${dstdir}/${fname}
done
Jetty ★★★★★
()
Последнее исправление: Jetty (всего исправлений: 1)
Ответ на: комментарий от den_v_pasternak

Как-то я пропустил уведомления из этой темы.

Если такое возможно.

Мне о таком не известно и исходя из внутреннего устройства гита это не должно быть возможным.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Можно. Иди обратно в школу, туфту советуешь. Освой Git, потом подходи, самоучка с улицы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.