Нажмите на удаленный сервер, исключая при этом некоторые зафиксированные файлы?
Недавно я интегрировал 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
флаг, позволяющий указать файлы, которые вы хотите исключить.