web-dev-qa-db-fra.com

Comment savoir s'il y a un rebase git en cours?

Lorsque je lance un git rebase -i, je peux émettre des commandes telles que git rebase --continue ou git rebase --abort. Ces commandes ne fonctionnent que si un rebase est en cours.

Comment puis-je savoir s'il y a un rebase en cours?

(J'apprécierais beaucoup quelques détails sur le fonctionnement interne de rebase; que fait git pour un repo qui lui donne le statut "rebase en cours" ,?)

58
Olivier Verdier

D'une part, il y a un ORIG_HEAD en place pendant un rebase (mais cela ne se limite pas à la commande rebase)

Mais vous pouvez aussi regarder le Git 1.7.0 2010 git-rebase.sh script lui-même (qui est aussi "interne" que vous pouvez obtenir;)).
Des lignes comme celles-là peuvent vous donner un autre indice:

dotest="$GIT_DIR"/rebase-merge
test -d "$dotest" -o -d "$GIT_DIR"/rebase-apply || die "No rebase in progress?"

sabgentoncommentaires :

  • Le dossier rebase-apply semble apparaître avec rebase
  • mais un dossier rebase-merge apparaît uniquement avec avec rebase -i.

Et hippie aussi commentaires , en 2017, que:

Les directives de codage découragent l'utilisation de -o (voir Documentation/CodingGuidelines ), donc la bonne manière maintenant (2017, mais aussi depuis 2011, Git 1.7.6) est:

(test -d ".git/rebase-merge" || test -d ".git/rebase-apply") || die "No rebase in progress?"

Jelaby suggère dans les commentaires :

(test -d "$(git rev-parse --git-path rebase-merge)" || \
 test -d "$(git rev-parse --git-path rebase-apply)" )

Cela gère correctement les arbres de travail et les dispositions inhabituelles ou non standard qui ne possèdent pas de répertoire .git et vous permet également d'exécuter ce test à partir d'un sous-répertoire du répertoire de travail. 

En effet, le git rev-parse --git-path <path> : résout "$GIT_DIR/<path>".


Git 2.6+ (T3 2015) affichera plus d'informations lors d'une nouvelle base:

Voir commit 592e412 , commit 84e6fb9 (06 juil. 2015), commit 84e6fb9 (06 juil. 2015), et commit df25e94 , commit 05eb563 (30 juin 2015 ) de Guillaume Pagès (gitster) .
(Fusion par Junio ​​C Hamano - gitster - in commit 178d2c7 , 03 août 2015)

status: donne plus d'informations pendant rebase -i

git status donne plus d'informations au cours de rebase -i, sur la liste des commandes effectuées lors de la création d'une nouvelle base.
Il affiche:

  • les deux dernières commandes exécutées et 
  • les deux prochaines lignes à exécuter. 

Il donne également des astuces pour trouver tous les fichiers dans le répertoire .git.

42
VonC

Vous pouvez également vérifier comment cette détection est effectuée dans la fonction __git_ps1 DANS contrib/completion/git-Prompt.sh , qui peut être utilisée pour l'invite bash git-aware:

                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
15
Jakub Narębski

Si vous avez EasyGit , eg status vous dira:

$ 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.)

Dans un terminal coloré, la notification est très importante:

<code>eg status</code> middle-of-rebase demonstration screenshot

(eg help topic middle-of-rebase affiche la documentation " Comment résoudre ou abandonner une rebase incomplète ".)

3
Rory O'Kane

Si un rebase interactif est en cours, cela vous indiquera où vous en êtes:

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

En ce moment, je suis en train d’éditer le patch “ktio” dans une base interactive.

S'il n'y a pas de rebase en cours, cela ressemblera à ceci:

$ cat .git/rebase-merge/done 
cat: .git/rebase-merge/done: No such file or directory
$ 
2
Ed Cashin

A partir d'une ligne de commande bash:

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

Cela retournera le code de sortie 0 (succès) s'il y a un dossier rebase, et le dossier sera renvoyé à STDOUT. Si vous êtes pas au milieu d'une base, alors rien ne sera généré et le code de sortie non nul sera renvoyé. Donc, vous pouvez même faire quelque chose comme ça:

ls `git rev-parse --git-dir` | grep rebase || echo no rebase
1
Alexander Bird

J'utilise cette commande is_rebase=$(git status | grep "rebasing" | wc -l)

0
BILL