Search code examples
gitgitignore

Advanced gitignore


I know you can use a pattern like *test* to ignore any directory or file containing word test.

But now I'm looking for something more advanced.

|- Folder A
|  |- File A
|  |- File B
|- Folder B
|  |- File C
|  |- File D
|  |- Pro.txt
|- Folder C
|  |- Pro.txt
|- Folder D
   |- File E
   |- File F

I want to ignore all folders that directly contain the Pro.txt file like Folder B & Folder C.
I do not want to ignore just the file, I want to ignore the whole folder (with subfolders and files)

The file Pro.txt is empty and just an indicator that which folders I do not wish to be uploaded on git and is not required to exist.

And before you say it, I can not change the folder name to contain a specific word.


Solution

  • To expand upon @IlyaBursov's comment, git doesn't just look for .gitignore in the root of your repository -- it looks for a .gitignore file in every directory. So if you have:

    .
    ├── Folder A
    │   ├── File A
    │   └── File B
    ├── Folder B
    │   ├── File C
    │   ├── File D
    │   └── .gitignore
    ├── Folder C
    │   └── .gitignore
    └── Folder D
        ├── File E
        └── File F
    

    And all those .gitignore files contain *, then running git add . in the root of the repository results in:

    $ git status
    On branch main
    
    No commits yet
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
            new file:   Folder A/File A
            new file:   Folder A/File B
            new file:   Folder D/File E
            new file:   Folder D/File F
    

    As you can see, git has ignored everything in Folder B (and in Folder C, but since that directory was empty, the .gitignore file is no-op; recall that git only tracks files, not directories).