Есть ли способ узнать, почему какой-то файл игнорируется git (то есть, какое правило в .gitignore
файле вызывает игнорирование файла)?
Представьте, что у меня есть этот (или гораздо более сложный сценарий с сотнями папок и десятками .gitignore
файлов:
/
-.gitignore
-folder/
-.gitignore
-subfolder/
-.gitignore
-file.txt
Если я запускаю git add folder/subfolder/file.txt
git, то могу жаловаться на игнорирование:
The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.
Есть ли способ узнать, какие из всех возможных .gitignore
имеют правило игнорировать этот файл, а также показать правило? Подобно:
The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.
Или просто:
$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt
git check-ignore
скоро (git1.8.5 / 1.9) появится--no-index
опция. Смотрите мой ответ нижеGIT_TRACE_EXCLUDE=1 git status
скоро появится дополнительный способ отладки.gitignore
правил. Смотрите мой отредактированный ответ нижеОтветы:
Смотрите man-страницу для более подробной информации.
Исходный ответ следует:
Git в настоящее время не предоставляет ничего подобного. Но после просмотра вашего вопроса я немного погуглил и обнаружил, что еще в 2009 году эта функция была запрошена и частично реализована . Прочитав ветку, я понял, что не будет слишком много работы, чтобы сделать это должным образом, поэтому я начал работу над патчем и надеюсь закончить его на следующий день или два. Я обновлю этот ответ, когда он будет готов.
ОБНОВЛЕНИЕ: Вау, это было намного сложнее, чем я ожидал. Внутренности
git
обработки исключений довольно загадочны. Во всяком случае, вот почти законченный ряд фиксаций , которые применяются к сегодняшней вверх по течению отрасли. Набор тестов завершен на 99%, но я еще не закончил обработку этого параметра. Надеюсь, я справлюсь с этим в эти выходные, а затем отправлю свои патчи в список рассылки git.master
--stdin
В то же время, я определенно приветствую тестирование от любого, кто может это сделать - просто клонировать с моего
git
форка , проверитьcheck-ignore
ветку и скомпилировать ее как обычно.ОБНОВЛЕНИЕ 2: Это сделано! Последняя версия находится на github, как указано выше, и я отправил серию патчей в список рассылки git для экспертной оценки. Давайте посмотрим, что они думают ...
ОБНОВЛЕНИЕ 3: После еще нескольких месяцев взлома / обзоров патчей / обсуждений / ожидания я рад сообщить, что эта функция теперь
master
доступна в ветке git и будет доступна в следующем выпуске (1.8.2, ожидается 8-е). Март 2013). Вотcheck-ignore
страница руководства . Фу, это было намного больше работы, чем я ожидал!ОБНОВЛЕНИЕ 4: Если вам интересна полная история о том, как этот ответ развивался и какая функция стала реализовываться, ознакомьтесь с выпуском № 32 подкаста GitMinutes .
источник
git check-ignore
ничего не делаю.git check-ignore
присутствует и работает в 1.8.2. Если поведение не соответствует ожидаемому, я предлагаю вам (пере) прочитать страницу руководства, а если это не так, отправьте соответствующий отчет об ошибке в список рассылки git. Просто сказать, что это ничего не делает, не очень полезно. Я ожидаю , что вы, вероятно , запустить его на не игнорировали файл и неправильно ожидает некоторый вывод (хотя я, вероятно , добавить поддержку--show-unmatched
в--verbose
режиме вывода в будущем).Обновление git 2.8 (март 2016 года):
Смотрите « Способ проверки
.gitignore
файла »Это является дополнением к
git check-ignore -v
описанному ниже.Оригинальный ответ: сентябрь 2013 (git 1.8.2, затем 1.8.5+):
git check-ignore
снова улучшается в git 1.8.5 / 1.9 (4 квартал 2013 года) :Смотрите коммит 8231fa6 с https://github.com/flashydave :
источник
Я не могу найти ничего на странице руководства, но вот быстрый и грязный скрипт, который проверит ваш файл в каждом родительском каталоге, чтобы узнать, можно ли его добавить в git. Запустите его в каталоге, содержащем файл проблемы, как:
где
STOP_DIR
- каталог верхнего уровня проекта Git иFILENAME
имя файла проблемы (без пути). Он создает пустой файл с тем же именем на каждом уровне иерархии (если он не существует) и пытаетсяgit add -n
определить, можно ли его добавить (он очищается после себя). Это выводит что-то вроде:Сценарий:
источник
Чтобы добавить к основному ответу об использовании
git check-ignore -v filename
(спасибо BTW), я обнаружил, что мой файл .gitignore блокировал все, потому что после подстановочного знака был символ новой строки, поэтому у меня было:* .sublime-project
Например. Я только что удалил перевод строки и вуаля! Это было исправлено.
источник