2010-04-14 3 views
3

Я использую функцию ветвления git для управления 5 вариантами небольшого веб-сайта. Есть 5 версий, которые будут жить в разных подкаталогах на производстве. Мой подход к проверке различных ветвей в их соответствующих папках состоял в том, чтобы:Использование ветвей git для вариантов проекта

mkdir foo && cd foo 
git init 
git remote add origin [email protected]:project.git 
git fetch origin foo:foo 

Где «foo» - данное название отрасли. Это было прекрасно, за исключением того, что он вытащил все мое репо (проекты, источник as3 и т. Д.) В эти папки папок, а не только публичную папку www, и это единственное, что я действительно хочу на производстве.

Есть ли более чистый способ справиться с этим? Git не может клонировать подкаталоги правильно?

ответ

2

Путь через DVCS функции (толкание/тянущий все Репо) заставляет вас рассуждать срок component (coherent set of files, со своим фиксацией жизненного цикла)

Вашей папка www должна быть в вашем случае submodule (Git) or subRepo (Mercurial) ,
Таким образом, вы сможете тянуть все.


Другое решение (если вы хотите сохранить ваш репозиторий как это есть), чтобы определить специальный «релиз» филиал (release_foo для foo), в которой вы снимаете все, но www.
Когда разработка на foo готова к выпуску, вы слились на release_foo и удалили на , что ветка, что вам не нужно.
Не ideal решение, но работоспособно.


Последнее решение, которое я забыл упомянуть первоначально доступна начиная с Git1.7:

sparse checkout

После того, как хранилище клонируют, прочитанный дерево трюк ограничивает свой «вид "в репозитории до только те файлы или каталоги, которые находятся в файле .git/info/sparse-checkout.

В вашем случае, вы можете просто создать один .git/info/sparse-checkout с соответствующей директории, и при обновлении рабочего дерева, только этот каталог (например, foo) появится.
Это еще одно решение, которое бы:

  • позволяет сохранить ваше хранилище неизмененной
  • избежать какой-либо «обслуживания» работа до доставки.
+0

Звучит как много обслуживания, чтобы выпустить файлы релизов в отдельную ветку. Я даже не знаю, как это сделать: после того, как я внес изменения в главную ветку, как я могу нажать файлы релиза на ветку релиза? – devth

+0

Я думаю, что попробую установить подмодули, если у меня будет время. В настоящее время у меня есть символические ссылки на сервере, указывающие на мой источник/www dir:/ – devth

+0

@Trevor: я считаю, что работа «обслуживание» очень мала, так как слияние должно быть тривиальным (вы дублируете 'foo' на' foo_release') , и единственная модификация, которую вы делаете на 'foo_release', - это удалить кучу каталогов. – VonC

1

Не смешивайте вещи, которые вы хотите сохранить в своем выпуске продукта.

Я предлагаю вам хранить ваши продукты (html, php, js, img и т. Д.) Отдельно от источников. Храните источники в проекте или проектах и ​​сохраняйте продукты отдельно в другом проекте. Или даже просто динамически создавайте продукты по требованию с помощью скрипта сборки, который копирует/генерирует/etc выход из источников. Таким образом, легко указать, какие источники генерируют то, что выводит.

+0

Мне нравится этот подход, но этот небольшой/быстрый проект и не успевает создать достойный процесс сборки. Нажатие релизов на отдельное репо также кажется, что нужно много работать вручную. Из-за этого я мог бы принять подмодулярный подход, упомянутый в ответе VonC. Спасибо за ваш ответ. – devth

0

В настоящее время (AFAIK) git будет клонировать весь репозиторий. Использование отдельного репозитория для развертывания может быть вариантом. Учитывая гибкость git, я бы не удивился, если бы вы могли нажать/вытащить из основного репозитория разработки и просто нажать одну ветвь во второй репозиторий развертывания, все из одного локального. Но я никогда не пробовал это.