Объясните, какое правило gitignore игнорирует мой файл
есть ли способ увидеть, почему какой-то файл игнорируется git (т. е. какое правило в .gitignore file вызывает игнорирование файла)?
представьте, что у меня есть это (или гораздо более сложный сценарий, с сотнями папок и десятками .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
4 ответов:
git check-ignore -v filenameпосмотреть на странице для более подробной информации.
оригинальный ответ следующее:
ГИТ в настоящее время не предоставляет ничего подобного. Но увидев ваш вопрос, я сделал некоторые погуглить и нашел, что еще в 2009 году эта функция была запрошена и частично реализована. После прочтения темы я понял, что это не будет слишком много работы, чтобы сделать это правильно, поэтому я начал работать над патчем и надеюсь, что он будет закончил на следующий день или два. Я буду обновлять этот ответ, когда он будет готов.
обновление: Вау, это было намного сложнее, чем я ожидал. Внутренности
git' s исключить обработку довольно загадочно. Во всяком случае, вот an почти законченная серия коммитов которые применяются к сегодняшнему восходящему потокуmasterфилиала. Набор тестов на 99% завершен, но я еще не закончил обработку пока. Надеюсь, мне это удастся выходные, а затем отправить мои патчи в список рассылки git.в то же время, я определенно приветствую тестирование от любого, кто в состоянии сделать это - просто клон от мой
gitвилки, проверьтеcheck-ignoreветвь, и скомпилировать его как обычно.обновление 2: дело сделано! Последняя версия находится на github, как указано выше, и у меня есть отправил серию патчей в список рассылки git для рецензирования. Давайте посмотрим, что они думают ...
обновление 3: после еще нескольких месяцев взлома / патч отзывы / обсуждения / ожидания, я рад, что могу сказать, что эта функция уже достиг в Git
masterфилиала, и будет доступна в следующем выпуске (1.8.2, ожидается 8 марта 2013 года). Вот этоcheck-ignoreстраница руководства. Фух, это было намного больше работы, чем я ожидал!обновление 4: если вы заинтересованы в полной истории о том, как этот ответ развивался и эта функция была реализована, проверьте эпизод №32 подкаста GitMinutes.
обновление git 2.8 (март 2016):
GIT_TRACE_EXCLUDE=1 git statusв разделе "способ проверки
.gitignorefile", что является дополнением к
git check-ignore -vописано ниже.
оригинальный ответ: сентябрь 2013 (git 1.8.2, затем 1.8.5+):
git check-ignoreснова улучшает в git 1.8.5 / 1.9 (Q4 2013):"
git check-ignore" следует тому же правилу, как "git add" и "git status" в том, что механизм ignore / exclude не действует на пути, которые уже отслеживаются.
С "--no-index" вариант, он может быть использован для диагностики, какие пути, которые должны были быть проигнорированы были ошибочно добавлены в индекс.посмотреть совершить 8231fa6 от https://github.com/flashydave:
check-ignoreв настоящее время показывает, как.gitignoreправила будут относиться к необработанному пути. Гусеничный пути не генерируют полезные выходные данные.
Это предотвращает отладку того, почему путь стал отслеживаться неожиданно, если этот путь не является сначала удаляется из индекса с помощьюgit rm --cached <path>.параметр
--no-indexсообщает команде, чтобы обойти проверку для пути, находящегося в индексе, и, следовательно, позволяет отслеживать пути, которые будут проверены тоже.в то время как это поведение отклоняется от характеристики
git addиgit statusего вариант использования вряд ли причиной путаницы пользователей.тестовые сценарии дополняются, чтобы проверить эту опцию против стандартных игнорирует для обеспечения правильного поведения.
--no-index::не смотрите в индекс при проведении проверок.
Это может быть использовано:
- для отладки, почему путь стал отслеживаться, например,
git add .и не был проигнорирован правилами, как ожидалось пользователем или- при разработке моделей включая отрицание, чтобы соответствовать пути, ранее добавленному с
git add -f.
Я не могу найти ничего на странице man, но вот быстрый и грязный скрипт, который проверит ваш файл в каждом родительском каталоге, чтобы узнать, можно ли его добавить git. Запустите его в каталоге, содержащем файл проблемы, как:
test-add.sh STOP_DIR FILENAMEздесь
STOP_DIRявляется каталогом верхнего уровня проекта Git иFILENAME- это имя файла проблемы (без пути). Он создает пустой файл с тем же именем на каждом уровне иерархии (если он не существует) и пытаетсяgit add -nчтобы увидеть, если он может быть добавлен (он очищает после себя). Он выводит что-то вроде:FAILED: /dir/1/2/3 SUCCEEDED: /dir/1/2сценарий:
#!/usr/bin/env bash TOP= FILE= DIR=`pwd` while : ; do TMPFILE=1 F=$DIR/$FILE if [ ! -f $F ]; then touch $F TMPFILE=0 fi git add -n $F >/dev/null 2>&1 if [ $? = 0 ]; then echo "SUCCEEDED: $DIR" else echo "FAILED: $DIR" fi if [ $TMPFILE = 0 ]; then rm $F fi DIR=${DIR%/*} if [ "$DIR" \< "$TOP" ]; then break fi done
добавить к основному ответу использования
git check-ignore -v filename(спасибо) Я нашел, что мой .файл gitignore блокировал все, потому что после подстановочного знака была новая строка, поэтому у меня было:
* .sublime-projectв качестве примера. Я просто удалил новую строку, и вуаля! Это было исправлено.
Comments