#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.