Git - Как правильно добавлять в gitignore?


 Toc

Интересные факты

  • Чтобы начать игнорировать файл который был ранее закомичен, нужно его удалить из гита. Пример

    
    $ echo debug.log >> .gitignore
    $ git rm --cached debug.log
    rm 'debug.log'
    $ git add .gitignore
    $ git commit -m "Start ignoring debug.log"
    
    Параметр --cached говорит что нужно удалить только из гита, сам файл остается без изменений

  • Для принудительного добавления файла в коммит, используй флаг -f (--force)

    
    $ cat .gitignore
    *.log
    $ git add -f debug.log
    $ git commit -m "Force adding debug.log"
    
    или использовать более наглядный способ
    
    $ echo '!debug.log' >> .gitignore
    $ cat .gitignore
    *.log
    !debug.log
    $ git add debug.log
    $ git commit -m "Adding debug.log"
    

  • Можно создать .gitignore не только в корне репы но и в кадой дире по отдельности, но лучше все же один единый

  • Можно создать персональный .gitignore файл который не попадет в репу но будет работать по тем же правилам. .git/info/exclude

  • Также можно создать глобальный .gitignore файл во всей системе. Пример

    
    $ echo logs > ~/.gitignore 
    $ git config --global core.excludesFile ~/.gitignore
    $ ls -l
    итого 4
    drwxrwxr-x 4 avis avis 4096 апр 27 18:10 logs
    $ git st
    На ветке master
    Ваша ветка обновлена в соответствии с «origin/master».
    нечего коммитить, нет изменений в рабочем каталоге
    
    
    Чтобы его удалить нужно поправить файлик ~/.gitconfig

  • Пример дебаггинга игнор файлика

    
    $ git check-ignore file.log
    file.log
    $ git check-ignore file.log -v
    .gitignore:1:*.log  file.log
    
    
    output
    [file containing the pattern]:[line number of the pattern]:[pattern] [file name]
    

Знаки

Знак Коммент
* ноль и более символов
** ноль и более каталогов
? ровно один символ
[0-9] один символ от 0 до 9
[05] один символ или 0 или 5
! Отрицание

Патерны

</table>
Патерн Пример Комментарий
**/logs ./logs/test.txt
./logs/dir/log.txt
./dir2/logs/dir/log.txt
Везде где будет найдена дира logs, содержимое будет проигнорированно
**/logs/log.txt

./logs/log.txt
./test/logs/log.txt
./logs/dir1/log.txt - уже не попадет в игнор!

Тоже самое что и пред. только для конкретного файла
*log.txt

./log.txt
./test/logs/log.txt
./logs/dir1/log.txt

Везде где будет найден файл log.txt
*.txt

./log.txt
./test/logs/log.txt
./logs/dir1/log.txt

Тоже самое действует и на расширение файла
.txt
!importan_file.txt
./log.txt
./test/logs/log.txt
./logs/dir1/log.txt
./logs/dir1/importan_file.txt - не попадет в игнор
Тоже самое действует и на расширение файла

*.txt
!imp/*txt
test*

./log.txt
./test/logs/log.txt
./logs/dir1/log.txt
./imp/file.txt
./imp/test.txt - тоже будет проигнорирован т.к. порядок важен!
Файлы
/test.txt ./test.txt
./logs/test.txt - не будет проигнорирован!
Игнорирует только файл в текущей дире
test.txt ./test.txt
./logs/test.txt
Если просто написать название файла, то будет поиск везде где он есть
test?.txt ./test2.txt
./test3.txt
./test.txt - не будет проигнорирован!
./test10.txt - не будет проигнорирован!
test[0-5].txt ./test2.txt
./test3.txt
./test6.txt - не будет проигнорирован!
./test7.txt - не будет проигнорирован!
./test10.txt - не будет проигнорирован!
test[05].txt ./test0.txt
./test5.txt
./test6.txt - не будет проигнорирован!
./test7.txt - не будет проигнорирован!
./test10.txt - не будет проигнорирован!
test[!05].txt ./test0.txt
./test5.txt
./test6.txt - не будет проигнорирован!
./test7.txt - не будет проигнорирован!
./test10.txt - не будет проигнорирован!
Диры
logs ./logs/test.txt ./logs/dir/test.txt ./dir/logs/dir/test.txt - не будет проигнорирован!
Везде где будет найдена дира (или файл), все содерживое диры будет в игноре
logs/ ./logs/test.txt ./logs/dir/test.txt ./dir/logs/dir/test.txt - не будет проигнорирован!
Если будет слеш - то все содержимое диры
Разница между logs и logs/
При logs, игнорируются как диры так и файлы

avis@avis-PC[17:54:16]:~/develop/123$ cat .gitignore 
logs
avis@avis-PC[17:54:24]:~/develop/123$ tree 
.
├── dir1
│   └── logs
│       └── file2.txt
├── dir2
│   └── logs
└── logs
    └── file1.txt

4 directories, 3 files
avis@avis-PC[17:54:28]:~/develop/123$ git st
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».
Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

  .gitignore

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

</code></pre>
    </td>
  </tr>

  
При logs/, игнорируются только диры

avis@avis-PC[17:57:27]:~/develop/123$ cat .gitignore 
logs/
avis@avis-PC[17:58:47]:~/develop/123$ tree 
.
├── dir1
│   └── logs
│       └── file2.txt
├── dir2
│   └── logs
└── logs
    └── file1.txt

4 directories, 3 files
avis@avis-PC[17:58:50]:~/develop/123$ git st
На ветке master
Ваша ветка обновлена в соответствии с «origin/master».
Неотслеживаемые файлы:
  (используйте «git add <файл>…», чтобы добавить в то, что будет включено в коммит)

  .gitignore
  dir2/

ничего не добавлено в коммит, но есть неотслеживаемые файлы (используйте «git add», чтобы отслеживать их)

</code></pre>
    </td>
  </tr>

  
logs/ !logs/importan_file.txt ./logs/bug.txt
!logs/importan_file.txt
Из за особенностей гита, такое работать не будет. Будут проигнорированны все файлы в logs
logs/**/test.txt ./logs/test.txt
./logs/dir1/test.txt
ноль и более каталогов
logs/dir*/file*.txt

В игноре


avis@avis-PC[18:10:49]:~/develop/123$ tree 
.
└── logs
    ├── dir1
    │   └── file1.txt
    └── dir2
        └── file2.txt

3 directories, 2 files