Як перерахувати файли, проігноровані git, які на даний момент інсценізовані або зроблені?


78

Як отримати список тих файлів, які відповідають правилу у файлі .gitignore, але які були індексовані або зроблені раніше?



1
З відповідей на інше питання, той, який ви шукаєте, - це, git ls-files -i --exclude-standardможливо, його варіація.
Cascabel

10
Наскільки я розумію, це НЕ дублікат шоу ігнорованих файлів у git . Це питання задає питання про те, як перерахувати відстежувані файли, які ігноруються. Це питання задає питання про те, як перерахувати файли, які відслідковуються (і, таким чином, звільняються від правил ігнорування), але були б проігноровані, якби вони не були відстежені.
Richard Hansen

Відповіді:


102

Документація до ls-filesне чітко написана, але, схоже, наступний простий псевдонім виконує цю роботу:

git config --global alias.showtrackedignored "ls-files -i --exclude-standard"

Вищевказана команда створює псевдонім, який викликається showtrackedignored. Для використання запустіть:

git showtrackedignored

і в ньому буде перелічено всі файли в поточному каталозі та підкаталогах, які відстежуються, але будуть проігноровані, якби вони не були відстежені.

Помилка git ls-files

На жаль, це не працює на 100% надійно. Очевидно, Git робить хорошу роботу з пошуку файлів, які не слід ігнорувати, але при пошуку файлів, які ігноруються ( -iопція to git ls-files), він не перераховує ігноровані файли всередині каталогу, якщо це каталог, який відповідає правилам ігнорування.

Щоб обійти цю помилку, спробуйте перетворити правила ігнорування так, щоб узгоджувались лише файли, а не каталоги (це не завжди можливо).

(Дякую Крістофу за те, що ви виявили цю помилку та повідомили про неї до списку розсилки Git ! Редагувати: зараз працює патч, який перетвориться на git 1.7.11.2 або пізнішої версії)

Альтернативний підхід

Ось інший підхід. Це набагато складніше і, можливо, порушило кутові справи.

git config --global alias.showtrackedignored '!
cd "${GIT_PREFIX}" &&
untracked_list=$(git rev-parse --git-dir)/ignored-untracked.txt &&
git ls-files -o -i --exclude-standard >"${untracked_list}" &&
GIT_INDEX_FILE="" git ls-files -o -i --exclude-standard | grep -Fvxf "${untracked_list}" &&
rm -rf "${untracked_list}"'

Псевдонім робить наступне:

  • cdповернутися до каталогу, з якого git showtrackedignoredбуло запущено (Git запускає псевдоніми на основі оболонки з каталогу верхнього рівня, а не поточного каталогу; див. розділ на alias.*в git help config)
  • Визначте змінну, яка називається untracked_list. Ця змінна містить шлях до тимчасового файлу, який міститиме список ігнорованих на даний момент файлів. Цей тимчасовий файл знаходиться в .gitкаталозі.
  • Напишіть список проігнорованих файлів ${untracked_list}.
  • Скажіть Git діяти так, ніби індекс порожній, і перелічіть усі проігноровані файли.
  • Конвеєр, який виводить до grep, який фільтрує файли, в які було записано ${untracked_list}.
  • Видаліть тимчасовий файл ${untracked_list}.

Недоліки такого підходу:

  • Він створює тимчасовий файл у вашому .gitкаталозі.
  • Передбачається, що у вас є оболонка, сумісна з POSIX.
  • Передбачається, що у вас є реалізація, сумісна з POSIX grep.

Він також страждає від тієї ж помилки, що і колишній псевдонім.


Чи нещодавно були зміни до git, які порушують цей сценарій? Він працював досить добре, оскільки я його знайшов, але нещодавно виявив, що він не виявляє всіх файлів / папок (або, можливо, просто папок), які були скоєні, але відповідають шаблону ігнорування. Я на git 1.7.9.5. Будь-які ідеї?
Крістоф,

1
@Christoph: Працює у мене з 1.7.10 на Linux (Ubuntu). Спробуйте вручну запустити кожну команду окремо, щоб побачити, яка частина сценарію не працює належним чином. Якщо ви знайдете проблему, повідомте мене, і я оновлю свою відповідь. Крім того, дайте мені знати, чи можете ви створити приклад сховища, яке відображає проблему. Дякую!
Річард Хансен,

1
@Christoph: git help ignoreкаже " foo/відповідатиме каталогу fooта шляхам під ним". Очевидно, частина "Шляхи під нею" працює, коли Git намагається ідентифікувати файли, які не ігноруються, але порушується, коли Git намагається ідентифікувати файли, які ігноруються.
Річард Хансен,

2
На сьогоднішній день git ls-files -i --exclude-standardнасправді є більш чистий і правильно працюючий підхід. У мене тут є репо, де звичайний псевдонім дає неправильні результати.
Крістоф

1
@Christoph: Дякую, я відредагував відповідь, щоб поставити простіший підхід зверху та додати попередження до складного підходу.
Річард Хансен,

21

Просто залишу цей тут на основі відповіді Річарда:

git ls-files -i --exclude-standard | xargs git rm --cached

Це видалить кожен відслідковуваний файл, який ігнорується .gitignore.


-3

На це запитання добре відповів https://stackoverflow.com/a/467053 . В основному, git clean -ndX підкаже, що можна безпечно ігнорувати.


У ньому перелічуються невідстежувані файли та каталоги, а якщо ви випустите їх d, то перелічуються невідстежувані файли разом із інсценованими та комітованими. На мою думку, це насправді не відповідає на питання.
Їжачок

@Hedgehog: Це копія, але seth вибрав з неї неправильну відповідь.
Cascabel

Я не заперечую, що вони перебувають в одному районі, але те, що вони не є дубльованими питаннями, схоже, стає зрозумілим із спостереження, що незрозуміло, який із цих відповідей, якщо такий є, робить саме це. Питання у " Показати проігноровані файли в git" - "перелічити, які існують файли, які ігноруються"
Їжачок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.