Як отримати список тих файлів, які відповідають правилу у файлі .gitignore, але які були індексовані або зроблені раніше?
git ls-files -i --exclude-standardможливо, його варіація.
Як отримати список тих файлів, які відповідають правилу у файлі .gitignore, але які були індексовані або зроблені раніше?
git ls-files -i --exclude-standardможливо, його варіація.
Відповіді:
Документація до 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}.grep, який фільтрує файли, в які було записано ${untracked_list}.${untracked_list}.Недоліки такого підходу:
.gitкаталозі.grep.Він також страждає від тієї ж помилки, що і колишній псевдонім.
git help ignoreкаже " foo/відповідатиме каталогу fooта шляхам під ним". Очевидно, частина "Шляхи під нею" працює, коли Git намагається ідентифікувати файли, які не ігноруються, але порушується, коли Git намагається ідентифікувати файли, які ігноруються.
git ls-files -i --exclude-standardнасправді є більш чистий і правильно працюючий підхід. У мене тут є репо, де звичайний псевдонім дає неправильні результати.
Просто залишу цей тут на основі відповіді Річарда:
git ls-files -i --exclude-standard | xargs git rm --cached
Це видалить кожен відслідковуваний файл, який ігнорується .gitignore.
На це запитання добре відповів https://stackoverflow.com/a/467053 . В основному, git clean -ndX підкаже, що можна безпечно ігнорувати.
d, то перелічуються невідстежувані файли разом із інсценованими та комітованими. На мою думку, це насправді не відповідає на питання.