git игнорирует шаблон .gitattributes

У меня есть такая структура каталогов:

root/
  .git
  deploy/
  Site/
    blah/
    more_blah/
      something.local
      else.development
    Rakefile
    .gitattributes

Редактировать: чтобы уточнить вышеизложенное, каталоги имеют конечный /, а дочерние элементы располагаются под каталогом, поэтому blah и more_blah являются каталогами, а Rakefile и .gitattributes являются файлами, но все четыре являются дочерними элементами Site.


Я запускаю git-archive из каталога Site вот так:

git archive --format=tar --prefix=git-v0.0.1/ v0.0.1 | gzip > ../deploy/git-v0.0.1.tar.zip

но какой бы шаблон я ни помещал в .gitattributes, результирующий архив всегда содержит Rakefile. Я пытался:

  • Rakefile
  • Сайт/Rakefile
  • */Rakefile
  • ./Rakefile
  • Рейкфайл*
  • *

Ни один из них не работает так, как я ожидал. Кто-нибудь готов указать на очевидное, но неочевидное для меня решение? Буду признателен за любую оказанную помощь.


Мои извинения за неясность.

  • Я сказал, что шаблон, который я использовал, похоже, не работает, но я использую "export-ignore" после шаблона.
  • Rakefile это не каталог, а просто файл
  • Файл .gitattributes успешно удаляет другие шаблоны из архива, Rakefile — не единственный используемый шаблон, но единственный, который не работает. Он не работает независимо от того, есть ли он у меня сам по себе или с другими шаблонами, и в любом месте файла. Это не так, из-за переименования определенных файлов, но не архивирования коммита с переименованием, которое я был появляется, чтобы получить некоторые хорошие результаты. Виноват! :С

Это мой .gitattributes (сидит в каталоге Site)

Rakefile        export-ignore
*.local         export-ignore
*.development   export-ignore
*.staging       export-ignore

person iain    schedule 02.04.2011    source источник
comment
Как выглядит ваш полный файл .gitattributes?   -  person Paŭlo Ebermann    schedule 02.04.2011


Ответы (7)


Не уверен, что это распространенный случай, но у меня возникли проблемы с исключением папки tests из исходного дерева, которое имеет много вложенных уровней папок. Если бы я написал только эту строку в .gitattributes

tests/* export-ignore

Это не сработало, и весь каталог остался в архиве. Решение состояло в том, чтобы добавить подстановочные знаки для всех уровней подкаталогов:

tests/* export-ignore
tests/*/* export-ignore
tests/*/*/* export-ignore
tests/*/*/*/* export-ignore
tests/*/*/*/*/* export-ignore

С этими строками каталог tests окончательно исчез из архива.

person Alexander Pravdin    schedule 23.05.2014
comment
Разве tests/** export-ignore не сработает в этом случае? - person Manuzor; 28.03.2016
comment
test/**/* — это то, что вам нужно, чтобы игнорировать все файлы любой глубины из каталога «tests». - person ansorensen; 07.04.2016

Я считаю, что @Jefromi предоставил мне информацию, необходимую для решения этой проблемы, с помощью своих комментариев, но он слишком скромен, чтобы присвоить себе заслуги, и я хотел бы сохранить свой рейтинг приемлемости на уровне 100% (совершенно справедливо), поэтому я дам ответ здесь:


Ладно, нужны были две вещи. --worktree-attributes сам по себе не работал, но когда я переместил файл .gitattributes в корневой каталог из каталога сайта, он сработал. Опять же, Git book подразумевает, что файл не обязательно должен находиться в корне, чтобы он работал "... (обычно корень вашего проекта)", поэтому я чувствую себя немного разочарованным этими документами (на этот раз) . Я также думаю, что это не то, о чем вы думаете, когда приходится выбирать файл, когда .gitignore просто работает, IMO.

person iain    schedule 11.04.2011
comment
Спасибо за правильный ответ на ваш вопрос. Другие ответы не помогли в моем случае. - person Jason Dagit; 22.05.2013

Примечание: чтобы игнорировать каталог, вам нужно иметь «/» в конце указанного каталога.

Rakefile/

Для архива, например, Arrowmaster упоминается в его ответ, а также Подробнее о книге Pro Git, вам нужна опция export-ignore:

Rakefile/ export-ignore
person VonC    schedule 02.04.2011
comment
Кроме того, обязательно либо зафиксируйте свой .gitattributes, либо используйте параметр --worktree-attributes для git archive. По умолчанию используются атрибуты архивируемого дерева; если они находятся только в рабочем каталоге, они обычно игнорируются. Для проверки вы можете использовать --worktree-attributes, а затем зафиксировать его, как только убедитесь, что он работает. - person Cascabel; 03.04.2011
comment
@Jefromi - я использовал инструкции в книге Git, но они не говорят вам необходимо проверить файл для его использования. Эти параметры для конкретного пути называются атрибутами Git и устанавливаются либо в файле .gitattributes в одном из ваших каталогов (обычно в корне вашего проекта), либо в .git/info/ файл атрибутов, если вы не хотите, чтобы файл атрибутов был зафиксирован в вашем проекте. Но теперь, когда вы это подняли, я вижу, что справочная страница git-archive предлагает опцию --worktree-attributes, чтобы это работало. Я попробую это сейчас. - person iain; 03.04.2011
comment
@Jefromi - Хорошо, нужны были две вещи. --work-attributes сам по себе не работал, но когда я переместил файл .gitattributes в корневой каталог из каталога сайта, он сработал. Опять же, книга Git подразумевает, что файл не обязательно должен находиться в корне, чтобы он работал... (обычно корень вашего проекта), поэтому я чувствую себя немного разочарованным этими документами (на этот раз). Я также думаю, что это не то, о чем вы думаете, когда приходится выбирать файл, когда .gitignore просто работает, IMO. В любом случае, я считаю ваш комментарий правильным ответом, поэтому, если вы хотите превратить этот комментарий в ответ, я могу пометить его так. - person iain; 03.04.2011
comment
Невозможно добавить след '/' в версии 1.7.5.4 - person Brook; 24.08.2012

Для каталогов у меня были проблемы с разными версиями git, поэтому мне пришлось включить запись оба с обучающей косой чертой и без нее:

  • foo/bar экспорт-игнорировать
  • foo/bar/ экспорт-игнорировать

Где foo/bar относится к тому, где я запускал архив git, но фактический .gitattributes находился в корневом каталоге проекта в дополнение к --worktree-attributes, как указано выше. .

person Tim Lum    schedule 16.10.2013

В git версии 1.7.2.5, которая используется по умолчанию в Debian Squeeze (отсюда и этот пост), в конце не должно быть косой черты, чтобы игнорировать каталог. Таким образом, чтобы игнорировать каталог развертывания в приведенном выше вопросе, необходимо использовать следующую строку (без косой черты):

deploy        export-ignore

Это противоречит документации (man gitattributes / man gitignore) и книге git. Документация gitattributes ссылается на gitignore. Интересно, что каталоги с косой чертой (deploy/) работают в файле .gitignore.

Я не тестировал более поздние версии git.

person Holger Böhnke    schedule 21.08.2012
comment
С git 1.8.1.1 это не так. Если вы не укажете косую черту в конце, каталог будет добавлен в архив. - person Cas; 25.02.2013

Если вы хотите, чтобы git игнорировал файл, поместите его в файл .gitignore не файл .attributes.

Если вы хотите игнорировать свой Rakefile, поместите следующее в файл .gitignore в корне вашего проекта.

/**/Rakefile

Укажите полный путь, если у вас их несколько и вы хотите игнорировать только один из них.

Несколько примеров того, как реализовать сопоставление с образцом для этих файлов:

For All Files in All Folders
/**/*.ext
For A File in All Folders
/**/some_file.ext
File in Root Folder
/some_file.ext
File in A Folder
/some_folder/some_file.ext
All Files in A Folder
/some_folder/*
person JerodG    schedule 27.02.2020

Вы пытаетесь включить файлы в репозиторий, но не в архив, созданный из git archive? Если да, то синтаксис ваших .gitattributes файлов неправильный. Если нет, то .gitattributes - это не то, что вам следует использовать.

Чтобы файлы были исключены из архива, созданного git archive, вы должны поместить следующее в файл .gitattrubutes.

Rakefile export-ignore
person Arrowmaster    schedule 02.04.2011