2016-11-21 2 views
3

Я использую Windows 7 с Git v2.8.3.Git - Как игнорировать все файлы внутри одного каталога рекурсивно, но некоторые файлы с определенным расширением

У меня есть this directory structure, который содержит репозиторий Git.

testing_gitignore 
│ .gitignore 
│ file_1.txt 
│ file_2.txt 
│ 
├───dir_1 
│  file_11.txt 
│  file_12.txt 
│  file_13.txt 
│ 
└───dir_2 
    │ file_21.txt 
    │ file_22.txt 
    │ file_23.xlsx 
    │ file_24.txt 
    │ 
    └───dir_21 
      file_211.txt 
      file_212.xlsx 
      file_213.txt 

Я хочу настроить файл .gitignore для того, чтобы игнорировать все файлы внутри dir_2 рекурсивно, но сохраняющий (для фиксации) файлы с расширением: .xlsx (рекурсивно).

Внутри .gitignore я использовал следующее:

/dir_2/* 
/dir_2/**/* 
!/dir_2/*.xlsx 
!/dir_2/**/*.xlsx 

Но я не получаю никакого успеха, потому что я получаю в качестве файлов commit следующего списка (который вы можете увидеть также here):

.gitignore 
file_1.txt 
file_2.txt 
dir_1\file_11.txt 
dir_1\file_12.txt 
dir_1\file_13.txt 
dir_2\file_23.xlsx 

но Я ожидаю, что он должен быть включен (как файл для фиксации) файла:

dir_2/dir_21/file_212.xlsx 

Не могли бы вы дать мне конфигурацию .gitignore для этого? (до размещения здесь вы могли бы попробовать сам со структурой каталогов я прикрепленной ранее для скачивания по ссылке?)

ответ

4

пытается игнорировать файлы, но повторно включать папки:

/dir_2/**/* 
!/dir_2/**/ 

(Обратите внимание на /**/* первого правила: он рекурсивно игнорирует все файлы и папки, а затем повторно включает папки !/**/ во втором правиле).

Тогда вы можете повторно включить файлы (потому что их папки не игнорируются)

!/dir_2/**/*.xlsx 

Основное правило о .gitignore остается:

It is not possible to re-include a file if a parent directory of that file is excluded.

Так пренебрегая файлы и папки (с '/**/*') означает, что вы не сможете повторно включать файлы, если их родительские папки сами повторно включены (с !/**/: конечные косые черты означают «папки»).
Полный .gitignore:

/dir_2/**/* 
!/dir_2/**/ 
!/dir_2/**/*.xlsx 

Обратите внимание, что вы не должны совершать .gitignore, чтобы проверить его действие: изменить его, и сделать git status: до тех пор, как те файлы, в которых не отслеживаются (сделать git rm -r --cached dir_2 первый) , действие этих правил будет незамедлительным.

С этой .gitignore на месте, сделайте git add ., и git status: он должен показывать только *.xlsx под dir_2/, как добавляется.

[обратить внимание на символы подчёркивания]

+0

не могли бы вы уточнить подробности об этом ?. Я пробовал ваши первые 3 строки, но не работал. спасибо –

+0

@DavidSmith Я отредактировал ответ. – VonC

+0

Я пробовал ваши последние 3 строки, но все еще не работал. Я еще не совершил 'commit' (даже без первоначальной фиксации), поэтому я думаю, что мне не нужно делать' git rm'. –

Смежные вопросы