Объясните, какое правило 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
674   4  

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

в разделе "способ проверки .gitignore file"

, что является дополнением к 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

    Ничего не найдено.