В git есть ли способ показать неотслеживаемые спрятанные файлы без применения кеша?

Если я бегу git stash -uЯ могу хранить неотслеживаемые файлы. Однако указанные неотслеживаемые файлы вообще не отображаются с git stash show stash@{0}, Есть ли способ показать неотслеживаемые спрятанные файлы без применения кеша?

7 ответов

Решение

Неотслеживаемые файлы хранятся в третьем родительском элементе stash commit. (На самом деле это не задокументировано, но это довольно очевидно из коммита, который представил функцию -u, 787513..., и того, как остальная часть документацииgit-stash фразы вещи... или просто делая git log --graph stash@{0})

Вы можете просмотреть только "неотслеживаемую" часть тайника через:

git show stash@{0}^3

или просто "неотслеживаемое" дерево через:

git show stash@{0}^3:

или определенный "неотслеживаемый" файл в дереве через:

git show stash@{0}^3:<path/to/file>

К сожалению, нет хорошего способа получить сводку различий между всеми стадиями + неустановленными + неотслеживаемыми и "текущим" состоянием. то есть: git show stash@{0} нельзя включить неотслеживаемые файлы. Это связано с тем, что объект дерева stash фиксирует сам себя, называемый stash@{0}:, не включает в себя никаких изменений от третьего, "неустановленного" родителя.

Это происходит из-за повторного применения тайников: отслеживаемые файлы могут быть легко применены как исправления, тогда как неотслеживаемые файлы теоретически могут применяться только как "целые файлы".

Вы можете получить список всех коммитов с помощью следующей команды:

git rev-list -g stash

Поскольку хранилища представлены как трехсторонняя фиксация слияния HEAD, индекса и "родительской" фиксации неотслеживаемых файлов без родительской привязки, неотслеживаемые хранилища файлов могут быть перечислены путем передачи вышеприведенного вывода в следующее:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Полезные приложения из вышеперечисленного:

Показывать только неотслеженные, спрятанные файлы

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Конечно, удалите --stat чтобы увидеть содержимое файлов.

Найти конкретный файл

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

Grep неотслеживаемые файлы

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Перечислите все содержимое всех тайников

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

Однако указанные неотслеживаемые файлы вообще не отображаются с git stash show stash@{0}.

Примечание: начиная с Git 2.11 (4 квартал 2016 г., через 4 года после этого OP), вы можете ссылаться на тайник только с его индексом.

      git stash show 0

Была более свежая ошибка из-за переписывания на C, исправленная в Git 2.22 (второй квартал 2019 г.)

Есть ли способ показать скрытые файлы без отслеживания?

Почему, да, есть, с Git 2.32 (второй квартал 2021 года, через 9 лет после OP).

" " () научился необязательно показывать неотслеживаемую часть тайника.

См. , (3 марта 2021 г.) Дентон Лю ( Denton-L) .
(Слияние Junio ​​C Hamano - gitster- в коммите f5c73f6 , 22 марта 2021 г.)

коммит d3c7bf7: учить и

Подписано: Дентон Лю

Записи в тайник могут быть сделаны с неотслеживаемыми файлами через git stash push --include-untracked( ).

Однако, поскольку неотслеживаемые файлы хранятся в третьем родительском элементе записи тайника, а не в самой записи тайника, запускается ( человекman ) не включает неотслеживаемые файлы как часть diff.

С, неотслеживаемые пути, которые записаны в третьем родителе, если он существует, отображаются в дополнение к путям, которые имеют модификации между базой тайника и рабочим деревом в тайнике.

Можно вручную создать искаженную запись тайника, где повторяющиеся неотслеживаемые файлы в записи тайника будут маскировать отслеживаемые файлы.
В этом случае мы обнаруживаем и устраняем ошибку с помощью специального unpack_trees() Перезвони: stash_worktree_untracked_merge().

Кроме того, научите тайник опции, которая показывает только неотслеживаемые файлы записи тайника.
Это похоже на git show stash^3( man), но было бы неплохо предоставить для него удобную абстракцию, чтобы пользователям не приходилось думать о базовой реализации.

теперь включает в свою справочную страницу :

       'git stash' show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]

теперь включает в свою справочную страницу :

--no-include-untracked

При использовании с push и save команды, все неотслеживаемые файлы также сохраняются, а затем очищаются с помощью git clean.

При использовании с командой показывать неотслеживаемые файлы в записи тайника как часть diff.

--only-untracked

Эта опция действительна только для showкоманда.
Показывать только неотслеживаемые файлы в записи тайника как часть сравнения.


И у вас есть конфигурация для этих новых опций:

Коммит 0af760estash show: учиться

Подписано: Дентон Лю

Предыдущая фиксация учит git stash show --include-untracked( мужчинамужчина ).
Может быть желательно, чтобы пользователь мог всегда включать --include-untrackedповедение.
Обучите параметр конфигурации, который позволяет пользователям делать это аналогично.

git configтеперь включает в свою справочную страницу :

Если установлено значение true, git stash show команда без опции покажет неотслеживаемые файлы записи тайника.

По умолчанию false.

git stashтеперь включает в свою справочную страницу :

Вы можете использовать stash.showIncludeUntracked, stash.showStat, и stash.showPatch config, чтобы изменить поведение по умолчанию.

Чтобы просмотреть неотслеживаемые файлы в тайнике:

git ls-tree -r stash@{0}^3 --name-only

Чтобы показать полный diff всех неотслеживаемых файлов (с контентом):

git show stash@{0}^3


Эти команды читают последний (самый последний) тайник. Для более ранних тайников, например, увеличьте число за "тайником @" stash@{2} для второго из последнего тайника.

Это работает потому, что git stash создает коммит слияния для каждого тайника, на который можно ссылаться как stash@{0}, stash@{1} и т. д. Первым родителем этого коммита является HEAD во время тайника, второй родитель содержит изменения в отслеживаемых файлах, а третий (которые могут не существовать) изменения в неотслеживаемых файлах.

Это частично объясняется в справочной странице в разделе "Обсуждение".

Обходной путь: размещение файлов перед их сохранением сделает git stash show -p работать как положено.

git add .
git stash save

Примечание: этот способ дает возможность добавлять интерактивные части, вот как.
Внимание: убедитесь, что у вас нет ранее поставленной работы, или вы не сможете ее различить.
Это может быть полезно.

Чтобы увидеть все файлы в тайнике (как отслеженные, так и не отслеженные), я добавил этот псевдоним в свою конфигурацию:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Требуется один аргумент, тайник которого вы хотите просмотреть. Обратите внимание, что он все еще будет представлен в двух последовательных списках.

if...fi section меняет аргумент bash $1 на 0, если ни один не был передан.

У меня возникли проблемы с поиском и применением правильного тайника с моими неотслеживаемыми файлами с помощью git под 2.32.

Я использовал команду, чтобы найти тайник с неотслеживаемыми файлами и датой:

      git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

После того, как я использовал другую команду, чтобы показать список тайников с датой, чтобы найти правильную позицию тайника с конкретной датой:

      git stash list --date=local

А потом снова использую git stash list чтобы найти имя тайника и применить его с помощью git stash apply.

Это сработало для меня. Надеюсь, это сработает для кого-то другого!

Другие вопросы по тегам