Подтвердить что ты не робот

Git: Как игнорировать соответствующие каталоги в подкаталоге?

У меня есть проект со следующей структурой:

/.
  /src
    /project1
      /bin
      /obj
    /project2
      /bin
      /obj
  /tools
    /tool1
      /bin 

Что я могу добавить в мой .git/info/exclude, чтобы игнорировать все каталоги bin/obj в разделе "src"? Я не хочу явно указывать имя каждого проекта.

4b9b3361

Ответ 1

Попробуйте добавить эти строки в ваш файл .gitignore:

src/*/bin
src/*/obj

Ответ 2

Принятый ответ не сработал у меня.

> git --version
git version 1.7.0.2.msysgit.0

Кажется, что косые черты не работают с msysgit в файле .gitignore. Это работает.

*\bin
*\obj

Однако это будет исключать любые файлы с именем bin или obj, что вряд ли будет проблемой, за исключением тех случаев, когда оно есть. Следующее обходит вокруг этого (и да, в этом случае работает косая черта):

bin/
obj/
*.user
*.suo

Это соответствует файлам на разных глубинах в иерархии под папкой, в которой помещается файл .gitignore. Обратите внимание, что указанное выше не сработало, когда я включил префикс для определенной подпапки, поэтому я поместил его непосредственно в папку Source.

Как пользователь Visual Studio (предположительно OP тоже из ссылки bin/obj), также приятно исключать файлы .user и .suo.


Из спецификация gitignore:

Шаблоны имеют следующий формат:

  • Пустая строка не соответствует файлам, поэтому она может служить разделителем для удобства чтения.

  • Строка, начинающаяся С#, служит в качестве комментария.

  • Дополнительный префикс! что отрицает шаблон; любой сопоставимый файл, исключенный предыдущим шаблоном, снова будет включен. Если совпадение с отрицательным шаблоном, это переопределит источники шаблонов с более низким приоритетом.

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

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

  • В противном случае git рассматривает шаблон как оболочку оболочки, подходящую для использования fnmatch (3) с флагом FNM_PATHNAME: подстановочные знаки в шаблоне не совпадают с/в пути. Например, "Documentation/*. Html" соответствует "Documentation/git.html", но не "Documentation/ppc/ppc.html" или "tools/perf/Documentation/perf.html".

  • Ведущая косая черта соответствует началу пути. Например, "/*.c" соответствует "cat-file.c", но не "mozilla-sha1/sha1.c".

Ответ 3

Наиболее очевидным способом было бы добавить их в src/.gitignore:

obj/
bin/

Это игнорирует любые пути, которые находятся в вызове каталога obj, или каталог с именем bin из каталога src вниз.

Что-то вроде src/*/obj/ на верхнем уровне .gitignore может не работать, если у вас есть неровная иерархия проектов с некоторыми каталогами obj и bin, расположенными ниже дерева.

Здесь быстрая тестовая оболочка script показывает правило игнорирования в действии:

#!/bin/sh
mkdir src
mkdir tools

mkdir src/project1
mkdir src/project2
mkdir tools/tool1

mkdir src/project1/bin
mkdir src/project1/obj
mkdir src/project2/bin
mkdir src/project2/obj
mkdir tools/tool1/bin

touch testfile
touch src/testfile
touch tools/testfile
touch src/project1/testfile
touch src/project2/testfile
touch tools/tool1/testfile
touch src/project1/bin/testfile
touch src/project1/obj/testfile
touch src/project2/bin/testfile
touch src/project2/obj/testfile
touch tools/tool1/bin/testfile

git init

add_empty() { touch "$1" && git add "$1"; }

add_empty dummy
add_empty src/dummy
add_empty tools/dummy
add_empty src/project1/dummy
add_empty src/project2/dummy
add_empty tools/tool1/dummy

git status

printf 'obj/\nbin/\n' >src/.gitignore && git add src/.gitignore

git status

Неотслеживаемая секция файла первого состояния:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/bin/
#       src/project1/obj/
#       src/project1/testfile
#       src/project2/bin/
#       src/project2/obj/
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

И после добавления файла .gitignore:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

В качестве теста, чтобы доказать, что git не игнорирует файлы, называемые obj и bin, но игнорирует каталоги obj и bin дальше по иерархии после запуска этого script:

#!/bin/sh
mkdir src/project3
touch src/project3/testfile && git add src/project3/testfile
touch src/project3/obj
touch src/project3/bin

mkdir src/subdir
mkdir src/subdir/proj
touch src/subdir/proj/testfile && git add src/subdir/proj/testfile
mkdir src/subdir/proj/obj
mkdir src/subdir/proj/bin
touch src/subdir/proj/obj/testfile
touch src/subdir/proj/bin/testfile

Новые файлы без следа:

# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       src/project1/testfile
#       src/project2/testfile
#       src/project3/bin
#       src/project3/obj
#       src/testfile
#       testfile
#       tools/testfile
#       tools/tool1/bin/
#       tools/tool1/testfile

Ответ 4

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

git rm --cached */obj/*
git rm --cached */lib/*
git rm --cached *.user
git rm --cached *.suo
git rm --cached *ReSharper

затем добавьте его в .gitignore:

*/*/bin
*/*/obj
*.user
*.suo
*ReSharper*

затем зафиксировано:

git add .
git commit -m "removed user files and binaries from repository"

Ответ 5

Я считаю, что вы должны добавить

src/*/bin/*

до .gitignore, и все, что соответствует шаблону, будет игнорироваться.