git ignore exception
Asked Answered
B

12

459

I have a gitignore file that makes git ignore *.dll files, and that is actually the behavior I want. However, if I want an exception ( i.e. to be able to commit foo.dll), how can I achieve this?

Bornu answered 8/7, 2010 at 11:54 Comment(3)
possible duplicate of Exceptions in .gitignoreConsequent
fwiw, the granddaddy of duplicate answers on this topic--one that you should look over--would probably be Make .gitignore ignore everything except a few files - very regular activity and several good answers. I'm a particular fan of this answer, which seems clear and thorough.Automat
Possible duplicate of Make .gitignore ignore everything except a few filesAutomat
D
629

Use:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

From gitignore:

An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again. If a negated pattern matches, this will override lower precedence patterns sources.

Dakota answered 8/7, 2010 at 11:55 Comment(6)
See also answer form @Matiss Jurgelis - it's important additionWrongful
Can I add the exception to my project's gitignore and not my global gitignore? For example, if I wanted to include all DLLs in a directory? My gitignore_global has *.dll in it, and my project's gitignore has !Libs/*.dll but that doesn't seem to be working.Turves
@jkinz, you should try !Libs/**/*.dll.Maker
@RosbergLinhares Or !**/Libs/*.dll, depending on the folder structure.Pudency
Thanks, but on a mac adding the comment on the same line as the !foo.dll did invalidate the command. If I add the comment on a separate row it works.Custom
@Custom I had the same on Windows, # should be avoided.Scandian
M
389

Git ignores folders if you write:

/js

but it can't add exceptions if you do: !/js/jquery or !/js/jquery/ or !/js/jquery/*

You must write:

/js/* 

and only then you can except subfolders like this

!/js/jquery
Miff answered 6/2, 2013 at 14:33 Comment(5)
However looks like you can't add nested folders, e.g. !/js/jquery/xyzlib will not be ignored...Recuperative
As @Recuperative says, the folder you "except" from the ignore rule, must be at the same location as the "*"Mexicali
so /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Feels like a rather funny way to do it...Send
With git 2.21 not any of those solutions work - how can they ignore this problem!!!???Aflcio
@Recuperative for nested subfolders see https://mcmap.net/q/80218/-git-ignore-exceptionIaea
S
68

You can simply git add -f path/to/foo.dll.

.gitignore ignores only files for usual tracking and stuff like git add .

Saberio answered 8/7, 2010 at 11:56 Comment(3)
Just for more details, the -f tells git to force the adding of this file in the repo since it might ignore it first because of your .gitignoreGisele
Which is great if you only have one file, less useful if you need a patternHaunch
Good to know. But still better manage all the rules in the .gitignore than not knowing some rules are defined else where, especially in a team contextPesek
T
25

To exclude everything in a directory, but some sub-directories, do the following:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Source: https://gist.github.com/444295

Titration answered 3/5, 2012 at 17:13 Comment(1)
But what is about one file in subdirectory? ( dir1/ , !dir1/dir2/some_file )Kaminski
D
15

Just add ! before an exclusion rule.

According to the gitignore man page:

Patterns have the following format:

...

  • An optional prefix ! which negates the pattern; any matching file excluded by a previous pattern will become included again. If a negated pattern matches, this will override lower precedence patterns sources.
Downpipe answered 8/7, 2010 at 11:55 Comment(0)
I
8

For Nested Folders, I came up with a solution based on Matiss's answer.

Let's say I want to ignore everything in build/ directory (which is in /app). So I do:

build/*

However, if I want to exclude build/outputs/bundle/release subfolder, I need to play some hide and seek!


/app/build/*
!/app/build/outputs
/app/build/outputs/*
!/app/build/outputs/bundle
/app/build/outputs/bundle/*
!/app/build/outputs/bundle/release

Important Notes:

  • All the paths should start with / and be relative to the .gitignore
  • You have to do it one subfolder at a time. You can see in VS Code (for instance) what it includes and what not at every step.
Iaea answered 25/5, 2022 at 15:45 Comment(0)
K
5

!foo.dll in .gitignore, or (every time!) git add -f foo.dll

Keystone answered 8/7, 2010 at 11:58 Comment(0)
E
5

If you're working with Visual Studio and your .dll happens to be in a bin folder, then you'll need to add an exception for the particular bin folder itself, before you can add the exception for the .dll file. E.g.

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

This is because the default Visual Studio .gitignore file includes an ignore pattern for [Bbin]/

This pattern is zapping all bin folders (and consequently their contents), which makes any attempt to include the contents redundant (since the folder itself is already ignored).

I was able to find why my file wasn't being excepted by running

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

from a Git Bash window. This returned the [Bbin]/ pattern.

Extortionate answered 1/5, 2017 at 4:45 Comment(0)
M
4

The solution depends on the relation between the git ignore rule and the exception rule:

  1. Files/Files at the same level: use the @Skilldrick solution.
  2. Folders/Subfolders: use the @Matiss Jurgelis solution.
  3. Files/Files in different levels or Files/Subfolders: you can do this:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Maker answered 9/11, 2016 at 20:44 Comment(0)
K
2

This is how I do it, with a README.md file in each directory:

/data/*
!/data/README.md

!/data/input/
/data/input/*
!/data/input/README.md

!/data/output/
/data/output/*
!/data/output/README.md
Kibbutz answered 29/1, 2021 at 23:21 Comment(0)
R
1

Since Git 2.7.0 Git will take exceptions into account. From the official release notes:

  • Allow a later "!/abc/def" to override an earlier "/abc" that appears in the same .gitignore file to make it easier to express "everything in /abc directory is ignored, except for ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

edit: apparently this doesn't work any more since Git 2.8.0

Rossetti answered 6/1, 2016 at 1:48 Comment(3)
does this work for anyone? doesn't seem to work for me.Neurasthenia
https://mcmap.net/q/81424/-did-git-change-the-quot-quot-prefix-behavior-at-gitignore/125507 this was removedDemonetize
It's not working for me on version 2.25.1. Do you happen to know a way around it ?Decerebrate
K
1

If you have a directory and want to ignore everything with the exception of some files (e.g. *.py files), you can do:

sub-dir/**/*.*
!sub-dir/**/*.py
Kibbutz answered 17/9, 2021 at 23:13 Comment(1)
This should be higher up. Also, you can explicitly set the deapth (not sure why you would) like so "folder/*/*" and "!folder/*/file"Daciadacie

© 2022 - 2024 — McMap. All rights reserved.