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 всякий раз, когда вам нужно, и она должна волшебным образом удалять файлы для вас каждый раз.