Git: 子目录中的 .gitignore

Git: .gitignore in subdirectories

我正在尝试用 git 管理我的 neoviminit.vim。 我想忽略除 .gitignore 所在文件夹中的 init.vim 和目录

中的一个 kalisi.vim 之外的所有内容

/bundle/vim-airline/autoload/airline/themes/

这是我现在的.gitignore:

# Ignore everything
*

# Exceptions
!.gitinore
!init.vim

!bundle
bundle/*
!bundle/vim-airline
bundle/vim-airline/*
!bundle/vim-airline/autoload
bundle/vim-airline/autoload/*
!bundle/vim-airline/autoload/airline
bundle/vim-airline/autoload/airline/*
!bundle/vim-airline/autoload/airline/themes
bundle/vim-airline/autoload/airline/themes/*
!bundle/vim-airline/autoload/airline/themes/kalisi.vim

我对此的看法:

我想你明白了...

但是如果我执行 git status 现在只得到 bundle/ 作为未跟踪的文件。我不应该得到 kalisi.vimbundle/vim-airline/autoload/airline/themes/kalisi.vim 吗?

我希望有一种更优雅的方式说实话。我还听说过在目录中放置多个 .gitignore,但是子目录都是有自己的 .gitignore 的项目,这会产生大量工作,只不忽略正确的 [=15] =].

我希望有人知道该怎么做,目前似乎 bundle/ 目录被跟踪了,但没有我想要的内容...

正如我在“How do I add files without dots in them (all extension-less files) to the gitignore file?”中提到的,有一条规则需要记住 .gitignore:

It is not possible to re-include a file if a parent directory of that file is excluded. ()
:除非在git 2.7+中满足某些条件)

这意味着,当您排除所有内容 ('*') 时,您必须先将文件夹列入白名单 ('/**/'),然后才能将文件列入白名单。

# Ignore everything
*

# Exceptions
!.gitinore
!init.vim
!/**/
!bundle/vim-airline/autoload/airline/themes/kalisi.vim

OP LastSecondsToLive实际上采用了更简单的方法:

I created a commit with bundle/vim-airline/autoload/airline/themes/kalisi.vim then I switched my .gitignore back to:* !.gitinore !init.vim to ignore everything, but since bundle/vim-airline/autoload/airline/themes/kalisi.vim is already tracked, changes will get tracked in the future.