Как узнать, существует ли переформатирование git?
Когда я запускаю git rebase -i
, я могу выдавать команды типа git rebase --continue
или git rebase --abort
. Эти команды работают только в том случае, если выполняется переформатирование.
Как я могу узнать, есть ли переформатирование?
(Я бы очень признателен за некоторые подробности о том, как работает rebase внутри, что делает git для репо, что дает ему статус "rebase in progress",?)
Ответы
Ответ 1
Во-первых, существует ORIG_HEAD
во время rebase (но это не ограничивается командой rebase)
Но вы также можете посмотреть 2010 Git 1.7.0 git-rebase.sh
script себя (что как "внутреннее", как вы можете получить;)).
Такие строки могут дать вам еще один ключ:
dotest="$GIT_DIR"/rebase-merge
test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply || die "No rebase in progress?"
sabgenton комментарии:
- Появится папка
rebase-apply
с rebase
,
- но папка
rebase-merge
отображается только с помощью rebase -i
.
И hippy также комментарии, в 2017 году, что:
Рекомендации по кодированию препятствуют использованию -o
(см. Documentation/CodingGuidelines
), поэтому правильный путь теперь (2017, но также с 2011 года, Git 1.7.6):
(test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?"
Jelaby предлагает в комментариях:
(test -d "$(git rev-parse --git-path rebase-merge)" || \
test -d "$(git rev-parse --git-path rebase-apply)" )
Это правильно обрабатывает рабочие и необычные или нестандартные макеты, не имеющие каталога .git
, а также позволяет запускать этот тест из поддиректора рабочего каталога.
Это потому, что git rev-parse --git-path <path>
: разрешает "$GIT_DIR/<path>
".
Git 2.6+ (Q3 2015) будет печатать больше информации во время переустановки:
См. commit 592e412, зафиксировать 84e6fb9 ( 06 июля 2015 г.), commit 84e6fb9 (06 июля 2015 г.) и commit df25e94, зафиксировать 05eb563 (30 июня 2015 г.) Guillaume Pagès (gitster
).
(слияние Junio C Hamano - gitster
- в commit 178d2c7, 03 августа 2015 г.)
status
: укажите более подробную информацию во время rebase -i
git status
дает больше информации во время rebase -i
, о списке команд, которые выполняются во время rebase.
Он отображает:
- выполняются последние две команды и
- выполнить следующие две строки.
Он также дает подсказки для поиска всех файлов в каталоге .git
.
Ответ 2
Вы также можете проверить, как это обнаружение выполняется в __git_ps1
в contrib/completion/git-prompt.sh
, который можно использовать для приглашения git -aware bash:
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
b="$(cat "$g/rebase-merge/head-name")"
elif [ -d "$g/rebase-merge" ]; then
r="|REBASE-m"
b="$(cat "$g/rebase-merge/head-name")"
else
if [ -d "$g/rebase-apply" ]; then
if [ -f "$g/rebase-apply/rebasing" ]; then
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
else
r="|AM/REBASE"
fi
Ответ 3
Если у вас EasyGit, eg status
скажет вам:
$ eg status
(Not currently on any branch.)
(YOU ARE IN THE MIDDLE OF A INTERACTIVE REBASE; RUN 'eg help topic middle-of-rebase' FOR MORE INFO.)
Changes ready to be committed ("staged"):
modified: .gitmodules
renamed: config_loader.rb -> code/config_loader.rb
Newly created unknown files:
vendor/
(YOU ARE IN THE MIDDLE OF A INTERACTIVE REBASE; RUN 'eg help topic middle-of-rebase' FOR MORE INFO.)
В цветном терминале уведомление очень заметное:
![<code>eg status</code> middle-of-rebase demonstration screenshot]()
(eg help topic middle-of-rebase
отображает документацию " Как разрешить или прервать неполную rebase".)
Ответ 4
Если происходит интерактивная перезагрузка, это скажет вам, где вы находитесь:
$ cat .git/rebase-merge/done
pick 786139e lrg
edit 668b8a6 ktio
$
Прямо сейчас Im редактирует патч "ktio" в интерактивной rebase.
Если не будет продолжения, это будет выглядеть так:
$ cat .git/rebase-merge/done
cat: .git/rebase-merge/done: No such file or directory
$
Ответ 5
В командной строке bash:
ls `git rev-parse --git-dir` | grep rebase
Это вернет код выхода 0 (успех), если есть папка переадресации, и он выведет папку переустановки в STDOUT. Если вы не находитесь в середине rebase, тогда он ничего не выведет и не вернет код выхода без кода. Таким образом, вы можете сделать что-то вроде этого:
ls `git rev-parse --git-dir` | grep rebase || echo no rebase