Ответ 1
Попробуйте добавить эти строки в ваш файл .gitignore:
src/*/bin
src/*/obj
У меня есть проект со следующей структурой:
/.
/src
/project1
/bin
/obj
/project2
/bin
/obj
/tools
/tool1
/bin
Что я могу добавить в мой .git/info/exclude, чтобы игнорировать все каталоги bin/obj в разделе "src"? Я не хочу явно указывать имя каждого проекта.
Попробуйте добавить эти строки в ваш файл .gitignore:
src/*/bin
src/*/obj
Принятый ответ не сработал у меня.
> 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
.
Шаблоны имеют следующий формат:
Пустая строка не соответствует файлам, поэтому она может служить разделителем для удобства чтения.
Строка, начинающаяся С#, служит в качестве комментария.
Дополнительный префикс! что отрицает шаблон; любой сопоставимый файл, исключенный предыдущим шаблоном, снова будет включен. Если совпадение с отрицательным шаблоном, это переопределит источники шаблонов с более низким приоритетом.
Если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он будет находить совпадение с каталогом. Другими словами, 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".
Наиболее очевидным способом было бы добавить их в 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
Смятение для меня состояло в том, что после добавления какой бы маски вы его не наложили, файлы останутся в репозитории, если они не будут принудительно удалены, поэтому, добавив исходное, скомпилированное визуальное студийное решение, мне пришлось очистить репозиторий:
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"
Я считаю, что вы должны добавить
src/*/bin/*
до .gitignore, и все, что соответствует шаблону, будет игнорироваться.