it-swarm.com.de

Wie kann man wissen, ob gerade eine Git Rebase läuft?

Wenn ich einen git rebase -i starte, kann ich Befehle wie git rebase --continue oder git rebase --abort ausgeben. Diese Befehle funktionieren nur, wenn gerade ein Rebase läuft.

Woher weiß ich, ob eine Rebase läuft?

(Ich würde mich über einige Details zur internen Funktionsweise von Rebase sehr freuen.

58
Olivier Verdier

Zum einen ist während einer Rebase ein ORIG_HEAD vorhanden (aber das ist nicht auf den Rebase-Befehl beschränkt)

Sie können sich aber auch das 2010 Git 1.7.0 git-rebase.sh-Skript selbst ansehen (das so "intern" ist, wie Sie bekommen können;)).
Zeilen wie diese können Ihnen einen anderen Hinweis geben:

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

sabgentonKommentare :

  • Der Ordner rebase-apply scheint mit rebase zu erscheinen. 
  • aber ein Ordner rebase-merge erscheint nur bei mit rebase -i.

Und Hippie auch Kommentare , 2017:

Die Kodierungsrichtlinien raten von der Verwendung von -o ab (siehe Documentation/CodingGuidelines ), also auf die richtige Art jetzt (2017, aber auch seit 2011, Git 1.7.6) ist:

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

Jelaby schlägt vor in den Kommentaren :

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

Dadurch werden Arbeitsbäume und ungewöhnliche oder nicht standardmäßige Layouts, die kein .git-Verzeichnis haben, korrekt verarbeitet. Außerdem können Sie diesen Test in einem Unterverzeichnis des Arbeitsverzeichnisses ausführen. 

Das liegt daran, dass der git rev-parse --git-path <path> : "$GIT_DIR/<path>" auflöst.


Git 2.6+ (Q3 2015) druckt während einer Rebase weitere Informationen:

Siehe Festschreiben 592e412 , Festschreiben 84e6fb9 (06 Jul 2015), Festschreiben 84e6fb9 (06 Jul 2015) und Festschreiben df25e94 , Festschreiben 05eb563 (30. Juni 2015 ) von Guillaume Pagès (gitster) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in commit 178d2c7 , 03 Aug 2015)

status: Geben Sie während rebase -i weitere Informationen an.

git status gibt während rebase -i weitere Informationen über die Liste der Befehle, die während der Neugestaltung ausgeführt werden.
Es zeigt an:

  • die letzten beiden ausgeführten Befehle und 
  • die nächsten zwei Zeilen, die ausgeführt werden sollen. 

Es enthält auch Hinweise zum Auffinden der gesamten Dateien im .git-Verzeichnis.

42
VonC

Sie können auch überprüfen, wie eine solche Erkennung in der __git_ps1-FUNKTION IN contrib/completion/git-Prompt.sh durchgeführt wird, die für git-aware bash verwendet werden kann. Prompt:

                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

Wenn Sie EasyGit haben, sagt Ihnen 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.)

In einem farbigen Terminal ist die Benachrichtigung sehr prominent:

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

(eg help topic middle-of-rebase zeigt die Dokumentation " So lösen oder brechen Sie eine unvollständige Datenbank ab "

3
Rory O'Kane

Wenn gerade eine interaktive Datenbank aufgebaut wird, erfahren Sie, wo Sie sich gerade befinden:

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

Im Moment bearbeite ich den "ktio" -Patch in einer interaktiven Basis.

Wenn es keine Rebase gibt, sieht das so aus:

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

Von einer Bash-Befehlszeile aus:

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

Dies gibt den Exit-Code 0 (Erfolg) zurück, wenn ein Rebase-Ordner vorhanden ist, und gibt den Rebase-Ordner an STDOUT aus. Wenn Sie nicht mitten in einer Rebase sind, wird nichts ausgegeben und ein Exit-Code ausgegeben, der nicht 0 ist. So könnte man sogar so etwas machen:

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

Ich verwende diesen Befehl is_rebase=$(git status | grep "rebasing" | wc -l)

0
BILL