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


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

5 63

5 ответов:

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

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

git show stash@{0}^3

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

git show stash@{0}^3:

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

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

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

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

вы можете перечислить все фиксации stash с помощью следующей команды:

git rev-list -g stash

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

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 untracked files

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 ls-tree -r stash@{0}^3 --name-only

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

git show stash@{0}^3


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

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

это частично объясняется в manpage в разделе "Обсуждение".

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

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

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

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

обходной путь: промежуточные файлы перед их сохранением сделают git stash show -p работать, как ожидалось.

git add .
git stash save

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