У git, чи існує спосіб відображення відслідковуваних схованих файлів, не застосовуючи скрипт?


100

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

Відповіді:


121

Файли, що не відслідковуються, зберігаються в третьому батьківському скрині. (Це насправді не задокументовано, але досить очевидно з комітету , який запровадив функцію -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@{0}:з тим, що дерев`яний об'єкт прихованої скриньки , який називається , не включає жодних змін з боку третього, "нестандартного" батька.

Це пов’язано із способом повторного застосування стасів: відстежені файли можна легко застосувати як виправлення, тоді як відслідковувані файли теоретично можна застосовувати лише як «цілі файли».


Отже, батьки прихованої комісії є (1. Здійснення прихованої скриньки зроблено проти 2. Покажчик 3. Нерозглянута робоча копія), а сама комісія зберігання містить відстежувану робочу копію? git stash showЗ'являється, що показує різницю між робочою копією та №1 (відповідний код від git-stash.sh:, git diff ${FLAGS:---stat} $b_commit $w_commitу якому $ b_commit - це №1, а $ w_commit - це прихований фіксатор); чи є якийсь вбудований спосіб для git stash showвключення №3?
Макс Нанасі

Як ви говорите, я не знайшов спосіб , щоб отримати один зведений вид схованки, але ви можете побачити його повну інформацію в одній команді з: git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
Зверніть увагу , що ви отримаєте потворну помилку ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) , якщо ви НЕ на насправді мають неотслежіваемих файли в цьому кублі (але думав , що ти зробив).
Рандалл

2
@antak: Неа, git stash showнічого НЕ показують неотслежіваемих файли (справжні , по крайней мере , мерзотник 2.7.4):
Норберт Берча

1
Примітка (2.13.2-linux): git stash popспочатку спробує відновити відслідковувані файли, потім спробу відновити відслідковані файли. Якщо остання операція не вдасться (наприклад, конфлікт), перша операція не буде відкатаною (файл без збережених файлів залишатиметься таким, як є, але файли не видаляються з диска), тож навіть якщо ви виправите конфлікт, наступне спливаюче вікно не вдасться все одно.
Марінос

22

Ви можете перерахувати всі приховані комісії за допомогою наступної команди:

git rev-list -g stash

Оскільки stass представлені у вигляді 3-х напрямних об'єднань файлів HEAD, індексу та без батьківських "root" фіксованих файлів, що не відслідковуються, нераціональні сховища файлів можуть бути перераховані, переносячи вищенаведений вихід у наступне:

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>

Знімайте файли без відстеження

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

10

Щоб перелічити непотрібні файли у сховці:

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

Щоб показати повну різницю всіх неподілених файлів (із вмістом):

git show stash@{0}^3

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

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

Частково це пояснено на сторінці сторінки в розділі "Обговорення" .


5

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

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Розділ змінює Баш міркування $ 1 в 0 , якщо жоден з них не був прийнятий.


5

Вирішення завдань: Постановка файлів перед тим, як зберігати їх, git stash show -pспрацює як очікується.

git add .
git stash save

Примітка. Цей спосіб дає також можливість додавання інтерактивних частин живлення, ось як .
Обережно: переконайтеся, що у вас не було попередньо поставленої роботи, або ви не зможете її розрізнити.
Це може бути корисним.

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