Как мне сказать Git игнорировать все, кроме подкаталога?

Я хочу игнорировать все файлы в моем хранилище, кроме тех, которые появляются в bin подкаталог. Я попытался добавить следующее к моему .gitignore:

*
!bin/*

Однако это не дает желаемого эффекта: я создал новый файл внутри bin/, но делаю git status все еще показывает nothing to commit (working directory clean),

Какие-либо предложения?

13 ответов

Решение

Это игнорирует корневые файлы и корневые каталоги, а затем игнорирует корневой каталог bin:

/*
/*/
!/bin/

Таким образом, вы получите весь каталог bin, включая подкаталоги и их файлы.

Здесь, как игнорировать все, кроме одного каталога "MY_SUPER_DUPER_TEMPLATE_directory" в некотором каталоге

Структура: / bitrix / templates /MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore

Вы должны исключить все на пути к пунктам назначения, но вы должны включить пункты назначения:

Примечание. Это файл исключения (т. Е. Gitignore), поэтому логика инвертирована. Игнорировать все, кроме каталога tsp, игнорировать все в каталоге tsp, кроме каталога src...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore

Единственная проблема, с которой вы столкнулись bin сам каталог не соответствует bin/* шаблон, так что мерзавец даже не смотреть в bin каталог.

На ум приходят два решения.

.gitignore:

*
!/bin/
!bin/*

или же

.gitignore:

*
!/bin/

bin/.gitignore:

!*

Я предпочитаю второе решение, так как первое решение не перестает игнорировать файлы в bin каталог, который находится в подкаталогах, которые не называются bin, Это может иметь или не иметь значения в вашей ситуации.

Из официального git doc один из примеров гласит:

Пример, чтобы исключить все, кроме определенной директории foo/bar (обратите внимание на /* - без косой черты подстановочный знак также исключит все, что находится внутри foo/bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Для объяснения о ведущем слеше: когда использовать ведущий слеш в gitignore.

Попробуйте следовать в последней версии GIT.

*
!*/
!/path/to/your/dir/**

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

/*
!/public_html
!/.gitignore

Вместо игнорирования всех файлов он будет игнорировать только файлы верхнего уровня, а не те, которые находятся в каталоге, который вы не хотите игнорировать.

Это .gitignore работает для меня:

*/
/*
!bin/

Поздно на вечеринку, но ни один из ответов не помог мне "из коробки". Это делает:

      * 
!bin
!bin/**
  • первая строка игнорирует все
  • вторая строка включает саму заднюю директорию "bin"
  • последняя строка включает обратно все содержимое каталога bin, независимо от того, насколько он вложен (обратите внимание на двойную звездочку),

Попробуйте эту неясную ошибку.

!bin**/**

Надеюсь, поможет:)

Поддержка документации по git

PS: попробуйте сначала, прежде чем комментировать.

Мне пришлось сделать это недавно:

*
!sub-dir/
!sub-dir/*

Я не уверен, почему мне нужны две строки, чтобы исключить одну папку, но это то, что сработало для меня и macos.

Мне кажется, я должен игнорировать не родительскую папку, а файлы и папки в ней, используя /*

      -- **/node_modules

++ **/node_modules/*

тогда

      ++ !node_modules/@my-package/

Вот мое решение. В моем сценарии у меня была папка со следующими подпапками:

  • база данных (основная папка)
    • conf (вложенная папка)
    • драйверы (вложенная папка)
    • jars (вложенная папка)
    • sql (вложенная папка)

И из папки базы данных я хотел нажать только папку sql, чтобы мой.gitignore файл был следующим:

database/*
!database/sql/

Где первая строка просто говорит игнорировать все подпапки в папке базы данных, а вторая строка означает, что вы игнорируете все подпапки в папке базы данных, исключите (не игнорируйте) подпапку sql

Другие вопросы по тегам