Comment savoir s’il y a une rebit en cours?

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

Comment puis-je savoir s’il y a une rebase en cours?

(J’apprécierais beaucoup certains détails sur le fonctionnement interne de rebase; qu’est-ce que git fait à un repo qui lui donne le statut “rebase in progress”?)

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

Mais vous pouvez également consulter le script git-rebase.sh 2010 de Git 1.7.0 (qui est aussi “interne” que vous pouvez);)
Des lignes comme celles-ci 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?" 

Commentaires de sabgenton :

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

Et hippy commente aussi, en 2017, que:

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

 (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 worktrees et les mises en page inhabituelles ou non standard qui n’ont 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.

C’est parce que git rev-parse --git-path : résout ” $GIT_DIR/ “.


Git 2.6+ (Q3 2015) imprimera plus d’informations lors d’un rebase:

Voir commit 592e412 , commit 84e6fb9 (06 juil. 2015), commit 84e6fb9 (06 juil 2015), et commettre df25e94 , valider 05eb563 (30 juin 2015) par Guillaume Pagès ( gitster ) .
(Fusionné par Junio ​​C Hamano – gitster – dans commit 178d2c7 , 03 août 2015)

status : donne plus d’informations lors de rebase -i

git status donne plus d’informations lors de la rebase -i , à propos de la liste des commandes effectuées pendant le rebase.
Il affiche:

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

Il donne également des conseils pour trouver la totalité des fichiers dans le répertoire .git .

Vous pouvez également vérifier comment une telle détection est effectuée dans la fonction __git_ps1 dans consortingb/completion/git-prompt.sh , qui peut être utilisée pour l’invite de consortingb/completion/git-prompt.sh sur 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 

Si vous avez EasyGit , eg status vous indiquera:

 $ 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/> par exemple statut </ code> capture d’écran de la démonstration de middle-of-rebase”></p>
<p>  ( <code>eg help topic middle-of-rebase</code> affiche la documentation « Comment résoudre ou annuler un rebase incomplet ».) </p>
</div>
</li><!-- #comment-## -->
<div class=

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, j’édite le patch «ktio» dans une rebase interactive.

S’il n’y a pas de rebase, cela ressemblera à ceci:

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

À partir d’une ligne de commande bash:

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

Cela renverra le code de sortie 0 (succès) s’il y a un dossier de rebase, et il affichera le dossier rebase dans STDOUT. Si vous n’êtes pas au milieu d’un rebase, il ne générera rien et retournera un code de sortie différent de 0. Donc, vous pourriez même faire quelque chose comme ceci:

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

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