Проверьте, является ли коммит записью в тайнике

В моем сценарии мне нужно знать, является ли данный коммит стандартным или записью в тайнике. Этот метод должен работать также для удаленных тайников, которые еще не собраны в мусор, поэтому он не может полагаться на проверку sha существующих записей тайника (например, git rev-parse stash@{X}).

Записи в Stash — это обычные коммиты. Вы можете проверить их с помощью git cat-file -p stash@{<number>}, это коммиты слияния между 1) фиксацией, на которую указывал ваш HEAD, когда вы спрятали, и 2) каким-то коммитом, автоматически созданным git, когда вы спрятали, ссылаясь на состояние индекса в момент спрятания.

Romain Valeri 11.06.2024 15:51

Это похоже на проблему XY. Что именно вы пытаетесь достичь, что заставляет вас думать, что вам нужно это сделать? Проверка наличия удаленных, но не собранных мусора тайников в любом случае кажется грязной операцией.

Marco Bonelli 11.06.2024 15:53

@MarcoBonelli Я пишу специальную команду для тайника, и прежде чем она внесет какие-либо изменения, я хочу, чтобы она проверила, действительно ли ref / sha, предоставленный пользователем, является тайником. Есть ли в этом вопросе какое-либо фактическое указание на проблему XY? Я чувствую, что в последнее время люди здесь называют проблему XY каждый раз, когда видят что-то, что им раньше не нужно.

Piotr Siupa 11.06.2024 17:30

@hlovdal Нет. Stash слишком полезен и удобен, чтобы игнорировать его существование.

Piotr Siupa 11.06.2024 17:33

@PiotrSiupa Что делает тайник, чего нельзя было достичь с помощью временных коммитов?

Romain Valeri 11.06.2024 17:50

@RomainValeri Я могу сохранить свой индекс, изменения в отслеживаемых файлах и все неотслеживаемые файлы с помощью одной простой команды, а затем восстановить их с помощью одной простой команды.

Piotr Siupa 11.06.2024 18:18

@PiotrSiupa Ничто из этого не является эксклюзивным для git stash, этого можно добиться с помощью тривиальных псевдонимов. Но извините за примечание не по теме, и, конечно, у каждого есть предпочтения относительно того, как работать. Заботиться!

Romain Valeri 12.06.2024 09:30

У Stash есть опасные , сложные особенности, которых нет у обычных коммитов.

hlovdal 12.06.2024 09:51

@hlovdal 1) Это проблема навыков, а не причуды. Stash работает так, как должен, и интуитивно понятен. Если вы предполагаете, что числа не изменятся при удалении записей, это ваша вина. Если вы не уверены, вы всегда можете обратиться к записям тайника по именам. 2) Это даже не настоящая проблема. Простой git reset --hard отменяет это. 3) Это не причуда, просто неудобно, и если вы хотите хранить индексные и непроиндексированные изменения отдельно, использовать rebase еще сложнее. Если у вас возникла эта проблема, значит, вы используете stash не так, как предполагалось. Мне трудно представить ситуацию, когда вам понадобится изменить существующую запись в тайнике.

Piotr Siupa 12.06.2024 10:50

@PiotrSiupa Само количество вопросов от людей, облажавшихся с тайником, само по себе является аргументом...

Romain Valeri 12.06.2024 11:59

@RomainValeri Я запустил поиск [git] stash is:question и оказалось, что их вообще не так много. Однако, если вы предполагаете, что популярность stash является причиной избавиться от него, может быть, нам также следует перестать использовать rebase, потому что, похоже, к нему гораздо больше вопросов, чем к stash?

Piotr Siupa 12.06.2024 12:23

@PiotrSiupa По личному опыту я очень часто помогал коллегам с неправильным обращением с тайниками, но опять же, я не сторонник того, чтобы «никогда не использовать тайник», делайте, как хотите.

Romain Valeri 12.06.2024 12:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У фиксации тайника есть 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.

jthill 11.06.2024 17:16

Это более или менее то, что говорят мои собственные наблюдения. :-( Я надеялся на какой-нибудь трюк с рефлогом или чем-то в этом роде. Думаю, я могу полагаться на древовидную структуру, а не на сообщения. Не знаю... мне это кажется фарфором. Возможно, я вышлю предупреждение только в том случае, если они этого не сделают. соответствовать.

Piotr Siupa 11.06.2024 17:42

@PiotrSiupa Я думаю, что сообщение index on: ref shorthash у второго родителя, где короткий хеш является первым родителем, должно быть достаточно надежным.

jthill 11.06.2024 19:16

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