Как узнать, существует ли переформатирование 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