Git: как игнорировать/указывать файлы для * checkout *
Если я не хочу отслеживать файлы .html, я могу добавить шаблон к .gitignore, и они будут проигнорированы. Я хотел бы знать, как я могу сделать обратное - при оформлении заказа, как я могу попросить git проверять только определенные типы файлов или не проверять определенные типы файлов?
Например, если я не хотел html файлы, я мог бы написать:
git checkout HEAD . --no .html
если это существовало:) Есть ли способ, уже встроенный, или мне просто нужно запустить что-то еще после проверки?
Любая помощь очень ценится.
Ответы
Ответ 1
Если вы хотите упаковать файлы для развертывания, вам, вероятно, не нужно - или хотите - само репо. Это именно то, что для git archive
. Несколько примеров из manpage (связанных):
git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)
Создайте tar-архив, содержащий содержимое последней фиксации в текущей ветке, и извлеките его в каталог /var/tmp/junk.
git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip > git-1.4.0.tar.gz
Создайте сжатый tarball для версии v1.4.0.
Вы должны быть в состоянии заставить его делать именно то, что вы хотите, с помощью атрибута export-ignore
:
export-ignore
Файлы и каталоги с атрибутом export-ignore не будут добавлены в архивные файлы. Подробнее см. gitattributes (5).
Например, чтобы исключить каталог private
и файлы mine.txt
и secret.c
, вы можете поместить в файл .gitattributes
:
private/ export-ignore
secret.c export-ignore
Как и файлы gitignore, вы можете поместить их в свой репозиторий, и они будут работать из этого каталога, но начать с верхнего уровня - хорошая ставка.
Ответ 2
Git Редкая проверка
Если вы хотите проверить часть своего репозитория, вы можете использовать опцию git sparse-checkout, которая имеет мощные правила include/exclude.
В следующем вопросе StackOverflow есть несколько полезных инструкций:
Git проверка, кроме одной папки
Но как резюме:
-
Включить опцию sparseCheckout
:
git config core.sparseCheckout true
-
Создайте файл с именем .git/info/sparse-checkout
, содержащий:
/*
!node_modules
который эффективно означает все, кроме каталога node_modules
, при проверке репозитория в рабочем каталоге.
Ответ 3
Поэтому я хотел отправить свой код без тестовых файлов на рабочий сервер.
Самый простой способ для меня - просто удалить все тестовые файлы с помощью rsync --exclude 'tests'
после распаковки архива.
Ответ 4
Просто не добавляйте их в исходный элемент управления? Точка git такова, что у каждого есть все репо локально....
Ответ 5
Вы не можете получить часть отдельной фиксации в Git. Вы либо тянете фиксацию, либо нет - нет полуострова.
Это означает, что если есть коммит, который добавляет кучу файлов, тогда вы можете получить все эти файлы (вытащив эту фиксацию в локальное репо) или ни один из них (не потянув за фиксацию).
Вы можете выбрать, что вы хотите, с помощью git cherry-pick
, но я подозреваю, что это не поможет вам в этом случае.
Обычно файл должен либо находиться в управлении версиями, либо нет - я не могу придумать, почему вы хотите, чтобы файл в Git только иногда. Если в вашем .gitignore есть что-то, то это, вероятно, хороший кандидат для полного удаления из репозитория. .gitignore в основном означает "не смотрите на этот файл, он не находится под управлением версиями".
(Если вы не возражаете переписывать историю своего репозитория, вы можете выбрать "фиксация", затем сделать git reset --mixed HEAD^1
и создать новые коммиты, которые не оставляют файлы, которые вы не хотите... но не сделайте это, если вы действительно не знаете, что делаете. Лучше просто удалить файлы и нажать новый фиксатор, который записывает удаление.)
EDIT: просто просмотрел ваш комментарий о желании определенных частей для развертывания. В этом случае я предлагаю вам создать ветку развертывания, которая удалит ненужные файлы. Вы можете переустанавливать эту ветку из mainline всякий раз, когда вам нужно, и она должна волшебным образом удалять файлы для вас каждый раз.