Git ignore - How do you override an exception to a

2019-01-27 03:33发布

I want to create a git repo of my bash settings and plugins and whatnot. I have ignored everything (line 0) and then manually added the files/folders that I want in the repo. (I have to do it this way because the repo is in my ~ folder.) I want to ignore all colour profiles in the .vim/colors/ directory, but I do want to include the one file that I am using (apprentice.vim).

The .vim/colors/* line doesn't seem to work - it doesn't ignore any of the files at all. Using !!.vim/colors/* doesn't work either. How am I supposed to make it override all previous rules and ignore the colors folder, then still allow the apprentice.vim file to be ignored?

/*

*.swp

!.gitignore

!.bashrc
!.bash_profile

!.vimrc
!.vim
.vim/colors/* # Don't include all of the other color schemes
!.vim/colors/apprentice.vim

标签: git gitignore
2条回答
Anthone
2楼-- · 2019-01-27 04:11

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
查看更多
Lonely孤独者°
3楼-- · 2019-01-27 04:16

Your rules seem to be fine. Except *.swp would be covered by /* and the comment not being on its own line.

As you can see all other .vim/colors are ignored. enter image description here

If your files have already been staged, you may need to unstage them and remove them from the repository, then readd them.

git rm --cached ./.vim/colors/*
git add ./.vim/colors/
git commit -m"Unstaged .vim/colors"

Final .gitignore to use

/*
!.gitignore

!.bashrc
!.bash_profile

!.vimrc
!.vim
.vim/colors/*
!.vim/colors/apprentice.vim
查看更多
登录 后发表回答