Проверьте, не спрятал ли что-нибудь «git stash»

#git #batch-file #git-stash

#git #пакетный файл #git-stash

Вопрос:

У меня есть командный скрипт Windows, предназначенный для объединения ветки dev с веткой проекта. Он начинается с чтения текущего названия ветки, сохранения изменений, извлечения и объединения ветвей разработки и проекта, затем переключается обратно на исходную ветку и извлекает тайник.

Проблема в том, что в stash может не быть никаких изменений. Это оставляет предыдущее хранилище в верхней части стека. Когда он доходит до конца скрипта и открывает тайник, он открывает предыдущий тайник, который не связан с текущей веткой.

 Set SourceBranch=dev
Set ProjectBranch=project

:: Stash current changes.
For /F "tokens=1,2" %%a In ('Git branch -q') Do If "%%a"=="*" Set CurrentBranch=%%b
Git stash save -u

:: Pull latest source branch.
Git checkout %SourceBranch%
Git pull
For /F "tokens=1,3" %%a In ('Git branch -q -v') Do If "%%a"=="*" Set MergeHash=%%b

:: Merge source into project branch.
Git checkout %ProjectBranch%
Git pull
Git merge --commit %MergeHash%||Exit 1

:: Return to original branch.
Git checkout %CurrentBranch%
Git stash pop
  

Как я могу получить отзыв от Git stash or Git status , чтобы определить, нужно ли мне открывать тайник?

Комментарии:

1. Стоит отметить, что у git pull и git rebase теперь есть --autostash аргумент с соответствующей rebase.autoStash конфигурацией. Это было добавлено в версии 2.6.

2. Редактирование этого, чтобы быть более похожим на bash, противоречит тому, что это командный скрипт Windows, и фактически делает его недействительным. 😉

Ответ №1:

Что вы хотите, так это:

 git stash list
  

git stash позволяет вам предоставить сообщение. Вы можете использовать сгенерированный токен в качестве своего сообщения, чтобы вы знали, что он не будет конфликтовать с другими сообщениями git stash.

Затем, когда вы хотите проверить, нужно ли всплывать, просто проверьте, содержит ли git stash list вывод ваш токен. Если да, откройте тайник.

Комментарии:

1. Мне нравится этот ответ. Он надежный

2.Мне больше всего нравится этот подход. Вот три строки, которые я в итоге использовал. GIT_STASH_MESSAGE="${RANDOM}" git stash -m "${GIT_STASH_MESSAGE}" git stash list | grep "${GIT_STASH_MESSAGE}" amp;amp; git stash pop --index

3. @david.tanner Это git stash push -m "${GIT_STASH_MESSAGE}" команда, которую вы упомянули, чтобы спрятать с сообщением, не сработала у меня на Mac. Однако добавление «push» сработало

Ответ №2:

 git stash list #get a listing of all stashes to parse
git stash show -p stash@{0} #replace 0 with number of relevant stash from list
  

Комментарии:

1. Как это помогает мне определить, было ли что-нибудь спрятано? Если изменений нет, ничего не скрыто, и ранее могло существовать любое количество тайников.

2. Grep вывод списка git stash для имени ветки, которое вас интересует. Хотя это предполагает, что у вас нет других тайников в той же ветке (вы, похоже, указали, что этого не сделали)

Ответ №3:

В Linux вы можете использовать git stash list | wc -l для подсчета количества записей тайника. Если нечего было прятать, то это возвращает то же самое до и после вашего фактического git stash . Я не уверен, что вы можете использовать это в Windows.

Комментарии:

1. Я не могу в это поверить, но я собираюсь это сделать.

2. Для меня это выглядит наиболее надежным.

Ответ №4:

Вы можете git diff и проверить вывод.

  • Если такового нет, то нечего делать stash .
  • Если есть вывод, то вы можете grep проанализировать его для конкретных вещей, которые вам нужны.

Есть какие-либо проблемы с этой стратегией?

Комментарии:

1. Если вы не предоставите конкретные параметры git stash , для меня это работает.

2. Используя эту стратегию, в моем случае вам нужно будет выполнить if дважды, чтобы сначала увидеть, следует ли вызывать stash, а затем, если вы собираетесь вызывать pop.