The issue was the # comment on the same line as .vim/colors/*, but here is an alternative.
The main rule for gitignore is:
It is not possible to re-include a file if a parent directory of that file is excluded.
That means:
(assuming the elements are not already versioned, in which case you need to git rm --cached them first):
- you need to ignore all the files recursively: that is '**'
- exclude all the folders recursively: those are '**/'
- exclude the file you want (which will work because its parent folder is not ignored as well)
Result:
/**
!/**/
!exclude what you want to *not* be ignored
# for instance
.vim/colors/* # Don't include all of the other color schemes
!.vim/colors/apprentice.vim
Check what is and is not ignored with git check-ignore -v (the -v is important):
git check-ignore -v -- afile
It is easier than un-ignoring a sub-folder manually, especially when the sub-folder content to un-ignore is several level deep: to exclude a file in a/b/c, you need first to un-ignore !/a, then !/a/b, then !/a/b/c)
Illustration/test:
C:\Users\vonc\prog\git\tests>git init i
Initialized empty Git repository in C:/Users/vonc/prog/git/tests/i/.git/
C:\Users\vonc\prog\git\tests>cd i
C:\Users\vonc\prog\git\tests\i>mkdir .vim\colors
C:\Users\vonc\prog\git\tests\i>touch .vim\colors\apprentice.vim
C:\Users\vonc\prog\git\tests\i>git st
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .vim/
nothing added to commit but untracked files present (use "git add" to track)
Simple .gitignore with /* rule:
C:\Users\vonc\prog\git\tests\i>sbt .gitignore
/*
C:\Users\vonc\prog\git\tests\i>git st
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)
Lets add !.gitignore.
.gitignore can now be tracked.
C:\Users\vonc\prog\git\tests\i>git st
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
nothing added to commit but untracked files present (use "git add" to track)
But if I add: 
.vim/colors/*
!.vim/colors/apprentice.vim
.vim all content is still ignored:
C:\Users\vonc\prog\git\tests\i>git st
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
nothing added to commit but untracked files present (use "git add" to track)
Let's check why with git check-ignore:
C:\Users\vonc\prog\git\tests\i>git check-ignore -v -- .vim\colors\apprentice.vim
.gitignore:1:/* ".vim\\colors\\apprentice.vim"
Adding !.vim works, because it un-ignore the folder, allowing the other rules within that folder to apply.
Still, this is simpler:
/**
!/**/
!.gitignore
.vim/colors/*
!.vim/colors/apprentice.vim