В моем сценарии мне нужно знать, является ли данный коммит стандартным или записью в тайнике.
Этот метод должен работать также для удаленных тайников, которые еще не собраны в мусор, поэтому он не может полагаться на проверку sha существующих записей тайника (например, git rev-parse stash@{X}
).
Это похоже на проблему XY. Что именно вы пытаетесь достичь, что заставляет вас думать, что вам нужно это сделать? Проверка наличия удаленных, но не собранных мусора тайников в любом случае кажется грязной операцией.
Сделайте себе и всем остальным одолжение и перестаньте использовать stash и вместо этого просто проверяйте временные данные как временные коммиты.
@MarcoBonelli Я пишу специальную команду для тайника, и прежде чем она внесет какие-либо изменения, я хочу, чтобы она проверила, действительно ли ref / sha, предоставленный пользователем, является тайником. Есть ли в этом вопросе какое-либо фактическое указание на проблему XY? Я чувствую, что в последнее время люди здесь называют проблему XY каждый раз, когда видят что-то, что им раньше не нужно.
@hlovdal Нет. Stash слишком полезен и удобен, чтобы игнорировать его существование.
@PiotrSiupa Что делает тайник, чего нельзя было достичь с помощью временных коммитов?
@RomainValeri Я могу сохранить свой индекс, изменения в отслеживаемых файлах и все неотслеживаемые файлы с помощью одной простой команды, а затем восстановить их с помощью одной простой команды.
@PiotrSiupa Ничто из этого не является эксклюзивным для git stash, этого можно добиться с помощью тривиальных псевдонимов. Но извините за примечание не по теме, и, конечно, у каждого есть предпочтения относительно того, как работать. Заботиться!
У Stash есть опасные , сложные особенности, которых нет у обычных коммитов.
@hlovdal 1) Это проблема навыков, а не причуды. Stash работает так, как должен, и интуитивно понятен. Если вы предполагаете, что числа не изменятся при удалении записей, это ваша вина. Если вы не уверены, вы всегда можете обратиться к записям тайника по именам. 2) Это даже не настоящая проблема. Простой git reset --hard
отменяет это. 3) Это не причуда, просто неудобно, и если вы хотите хранить индексные и непроиндексированные изменения отдельно, использовать rebase
еще сложнее. Если у вас возникла эта проблема, значит, вы используете stash не так, как предполагалось. Мне трудно представить ситуацию, когда вам понадобится изменить существующую запись в тайнике.
@PiotrSiupa Само количество вопросов от людей, облажавшихся с тайником, само по себе является аргументом...
@RomainValeri Я запустил поиск [git] stash is:question
и оказалось, что их вообще не так много. Однако, если вы предполагаете, что популярность stash
является причиной избавиться от него, может быть, нам также следует перестать использовать rebase
, потому что, похоже, к нему гораздо больше вопросов, чем к stash
?
@PiotrSiupa По личному опыту я очень часто помогал коллегам с неправильным обращением с тайниками, но опять же, я не сторонник того, чтобы «никогда не использовать тайник», делайте, как хотите.
У фиксации тайника есть 2 родителя. Скажите parent1
и parent2
. parent1
также является единственным родителем parent2
. График такой,
* 9129d71 WIP on master: d2b25fd hello world
|\
| * f38c1f8 index on master: d2b25fd hello world
|/
* d2b25fd hello world
Обновлять:
Как отмечает @jthill, в git stash -u
, который также хранит неотслеживаемые файлы, у головы есть третий родительский элемент parent3
. parent3
— корневой коммит.
*-. 5ec4337 WIP on (no branch): d2b25fd hello world
|\ \
| | * b4b28c3 untracked files on (no branch): d2b25fd hello world
| * ca727e1 index on (no branch): d2b25fd hello world
|/
* d2b25fd hello world
Их сообщения о фиксации соответствуют определенным шаблонам. Сообщение записи в тайнике начинается с WIP on $branch:
(от git stash
) или On $branch:
(от git stash push -m $msg
), за которым следует короткий sha1sum и тема parent1
. Сообщение parent2
начинается с index on $branch:
, за которым следует короткий sha1sum и тема parent1
. Сообщение parent3
также соответствует шаблону untracked files on $branch
. На оторванной ГОЛОВЕ $branch
буквально (no branch)
.
Мы можем создать 3 или 4 коммита с одним и тем же графом и сообщениями в обычной ветке, а голову также может съесть git stash apply $commit
. Но в реальных журналах это встречается нечасто. Таким образом, если 3 или 4 коммита соответствуют графу, а их сообщения о коммитах соответствуют этим шаблонам, заголовок можно рассматривать как запись тайника.
Может быть три родителя с -u
или --untracked
, и сообщение основного тайника настраивается, но да. Это примерно столько хорошего, сколько вы можете получить, единственное, что имеет значение, можно ли его использовать в качестве тайника, все остальное - это упомянутая проблема XY.
Это более или менее то, что говорят мои собственные наблюдения. :-( Я надеялся на какой-нибудь трюк с рефлогом или чем-то в этом роде. Думаю, я могу полагаться на древовидную структуру, а не на сообщения. Не знаю... мне это кажется фарфором. Возможно, я вышлю предупреждение только в том случае, если они этого не сделают. соответствовать.
@PiotrSiupa Я думаю, что сообщение index on: ref shorthash
у второго родителя, где короткий хеш является первым родителем, должно быть достаточно надежным.
Записи в Stash — это обычные коммиты. Вы можете проверить их с помощью
git cat-file -p stash@{<number>}
, это коммиты слияния между 1) фиксацией, на которую указывал ваш HEAD, когда вы спрятали, и 2) каким-то коммитом, автоматически созданным git, когда вы спрятали, ссылаясь на состояние индекса в момент спрятания.