В 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
команда.
Показывать только неотслеживаемые файлы в записи тайника как часть сравнения.
И у вас есть конфигурация для этих новых опций:
Коммит 0af760e
stash 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
.
Это сработало для меня. Надеюсь, это сработает для кого-то другого!