Как узнать, происходит ли git rebase? - PullRequest
63 голосов
/ 13 октября 2010

Когда я запускаю git rebase -i, я могу выдавать такие команды, как git rebase --continue или git rebase --abort. Эти команды работают, только если выполняется перебазирование.

Как я могу узнать, происходит ли ребазинг?

(Я был бы очень признателен за некоторые подробности о том, как внутренняя перебазировка работает; что делает git с репо, который придает ему статус "выполняется перебазировка"?)

Ответы [ 6 ]

49 голосов
/ 13 октября 2010

С одной стороны, есть ORIG_HEAD на месте во время перебазирования (но это не ограничивается командой rebase)

Но вы можететакже посмотрите на саму версию Git 1.7.0 git-rebase.sh script 2010 года (которая настолько «внутренняя», насколько вы можете получить;)).
Строки, подобные этим, могут дать вамдругая подсказка:

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 года, Git1.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,nd также позволяет запустить этот тест из подкаталога рабочего каталога.

Это потому, что git rev-parse --git-path <path>: разрешает "$GIT_DIR/<path>".


Git 2.6+ (3 квартал 2015 года) будет печатать большеинформация при перебазировании:

См. коммит 592e412 , коммит 84e6fb9 (06 июля 2015 г.), коммит 84e6fb9 (06 июля 2015 г.) и коммит df25e94 , коммит 05eb563 (30 июня 2015 г.) от Гийом Пагес (gitster) .
(объединено JunioC Hamano - gitster - в коммит 178d2c7 , 03 августа 2015 г.)

status: предоставить дополнительную информацию во время rebase -i

git status дает дополнительную информацию в течение rebase -i, о списке команд, которые выполняются во время перебазирования.
Отображает:

  • две последние выполненные команды и
  • следующие две строки должны быть выполнены.

Он также дает подсказки, чтобы найти все файлы в каталоге .git.

16 голосов
/ 13 октября 2010

Вы также можете проверить, как такое обнаружение выполняется в функции __git_ps1 в contrib/completion/git-prompt.sh, которую можно использовать для подсказки gash с учетом git:

                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 голосов
/ 24 апреля 2014

Из командной строки bash:

ls `git rev-parse --git-dir` | grep rebase

Это вернет код выхода 0 (успех), если есть папка rebase, и выведет папку rebase в STDOUT. Если вы находитесь , а не в середине перебазирования, то оно ничего не выведет и вернет код выхода, отличный от 0 Таким образом, вы могли бы даже сделать что-то вроде этого:

ls `git rev-parse --git-dir` | grep rebase || echo no rebase
3 голосов
/ 23 августа 2012

Если у вас 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.)

В цветном терминале уведомление очень заметное:

imageeg status middle-of-rebase demonstration screenshot">

(eg help topic middle-of-rebase отображает документацию « Как разрешить или отменить неполное исправление ».)

3 голосов
/ 08 августа 2012

Если происходит интерактивная перебазировка, вам сообщат, где вы находитесь:

$ cat .git/rebase-merge/done 
pick 786139e lrg
edit 668b8a6 ktio
$ 

Сейчас я редактирую патч «ktio» в интерактивной перебазировке.

Если перебазирования не происходит, это будет выглядеть так:

$ cat .git/rebase-merge/done 
cat: .git/rebase-merge/done: No such file or directory
$ 
1 голос
/ 23 мая 2018

Я использую эту команду is_rebase=$(git status | grep "rebasing" | wc -l)

...