Нажмите на удаленный сервер, исключая при этом некоторые зафиксированные файлы?

Недавно я интегрировал Git в свой рабочий процесс, и я впечатлен его возможностями. Это не только отличная VCS, но и обход по FTP при нажатии через ssh. Тем не менее, сегодня вечером я столкнулся с проблемой, и мне интересно, сможете ли вы, люди, помочь мне решить ее.

В проекте есть определенные файлы, которые я хочу отслеживать, но не хочу запускать в производство. Есть ли способ выдвинуть на рабочий сервер, исключая определенные файлы из репо? Два замечательных примера:

  • Файлы.less вообще не должны находиться на рабочем сервере, но АБСОЛЮТНО все равно следует отслеживать
  • Поскольку моя локальная и производственная среды работают в разных доменах, файлы.htaccess немного различаются. Я все еще хочу отследить их, так как большинство правил универсальны (и боль переписать, если они утеряны), но каждый раз, когда я запускаю свой локальный.htaccess, это нарушает мою производственную среду, и мне приходится исправлять файл вручную.

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

Я не знаю, помогает это или нет, но я использую Tower, чтобы помочь управлять всем.

2 ответа

Решение

У меня нет совершенно потрясающего решения для вас, поэтому я дам вам несколько вариантов для рассмотрения.

Во-первых, я обращался к подобным ситуациям в прошлом, используя отдельные ветви для производства, qa и dev. Это нарушает ваше желание "одного толчка".

Во-вторых, если вы действительно хотите сохранить все в одной ветке, вы можете использовать другую общую технику, которая заключается в исключении определенных файлов с помощью.gitignore, но ссылки на них в каждом рабочем каталоге через программную ссылку на изменяющийся файл. Ссылки поддерживаются в большинстве операционных систем, включая OSX, Unix-подобные (Linux, FreeBSD и т. Д.) И Windows NTFS с помощью команды MKLINK.

Чтобы настроить использование ссылок, вы должны переименовать файл.htaccess в.htaccess-dev, а затем скопировать и обновить его на.htaccess-dev, .htaccess-qa для всех ваших сред. Затем добавьте.htaccess к.gitignore и, наконец, создайте программные ссылки для правильной среды в каждой из ваших сред.

Например, если ваша система DEV была Windows, вы увидите что-то вроде:

C:\code\dev-example>ren .htaccess .htaccess-dev

C:\code\dev-example>mklink .htaccess .htaccess-dev
symbolic link created for .htaccess <<===>> .htaccess-dev

C:\code\dev-example>dir
 Volume in drive C is Boot
 Volume Serial Number is DC8C-D5C9

 Directory of C:\code\dev-example

06/02/2014  06:12 PM    <DIR>          .
06/02/2014  06:12 PM    <DIR>          ..
06/02/2014  06:09 PM                10 .gitignore
06/02/2014  06:09 PM    <SYMLINK>      .htaccess [.htaccess-dev]
06/02/2014  06:08 PM                22 .htaccess-dev
06/02/2014  06:12 PM                23 .htaccess-prod
               4 File(s)             55 bytes
               2 Dir(s)  13,497,245,696 bytes free

C:\code\dev-example>type .htaccess
# Config file for DEV

C:\code\dev-example>type .gitignore
.htaccess

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

Наконец, если вы можете реорганизовать свой проект, чтобы разделить код только для разработчиков на отдельные папки, вы можете использовать git sparse-checkout на производственном сервере, чтобы получить только те папки, которые вам нужны в prod. В сочетании с использованием программно-связанных файлов конфигурации это может позволить вам использовать рабочий процесс одним нажатием, сохраняя различные рабочие папки в dev/qa/prod. Смотрите http://briancoyner.github.io/blog/2013/06/05/git-sparse-checkout/

В Git невозможно выполнить коммит без определенных файлов. Коммит идентифицируется по хэшу его набора изменений и по коммиту, на котором он основан (который, в свою очередь, является хэшем наборов изменений и предыдущих коммитов). Исключение файлов изменяет, по крайней мере, один из наборов изменений, который, в свою очередь, изменит хэш (если только вы не попали в тот же хеш, но это настолько редко, что об этом едва ли стоит упоминать).

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

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

git archive --remote <path-to-bare-repo> --format tar <branch-to-checkout> | tar --extract --directory <path-to-extract> --exclude <pattern-of-files-to-exclude>

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

Другие вопросы по тегам