Verwenden des Schrägstrichs im Git-Zweignamen

222

Ich bin mir ziemlich sicher, dass ich irgendwo in einem beliebten Git-Projekt gesehen habe, dass die Zweige ein Muster wie "feature / xyz" hatten.

Wenn ich jedoch versuche, einen Zweig mit dem Schrägstrich zu erstellen, wird folgende Fehlermeldung angezeigt:

$ git branch labs/feature
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

Gleiches Problem für (mein erster Versuch):

$ git checkout -b labs/feature

Wie erstellt man in Git einen Zweig mit dem Schrägstrich?


quelle
1
Eigentlich sieht es so aus, als hättest du ein Problem mit deinem HEAD. Es sieht so aus, als ob git denkt, dass Sie HEADein Link zu dem Zweig sind, labs/featureder noch nicht erstellt wurde. Ich habe keine Ahnung, wie dies hätte passieren können, aber es bedeutet, dass Ihr Versuch, einen Zweig zu erstellen foo/bar, der darauf basiert, nicht funktioniert. Hast du eine Idee, wie du nicht mehr HEADweiterkommst?
CB Bailey
Es tut mir leid für die Verwirrung, die "Labs / Feature", nicht "Foo / Bar", bearbeitetes Beispiel.
FWIW alles vor dem Schrägstrich generiert ein Verzeichnis unter .git/refs/headsdh wenn Sie dies tun, sehen Sie git checkout -b feature/123in Ihrem projectRootFolder/.git/refs/headsVerzeichnis ein Verzeichnis mit dem Namen: featureIn diesem Verzeichnis sehen Sie einen Zweig mit dem Namen 123. Wenn Sie später eine andere feature/124als innerhalb des featureVerzeichnisses erstellen , sehen Sie einen Zweig mit dem Namen124
Honey
:-D "Eigentlich sieht es so aus, als hättest du ein Problem mit deinem HEAD" Nice one @CBBailey
Kent Bull

Antworten:

222

Sind Sie sicher, dass der Zweig labsnoch nicht existiert (wie in diesem Thread )?

Sie können nicht sowohl eine Datei als auch ein Verzeichnis mit demselben Namen haben.

Du versuchst, Git dazu zu bringen, im Grunde Folgendes zu tun:

% cd .git/refs/heads
% ls -l
total 0
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master
% mkdir labs
mkdir: cannot create directory 'labs': File exists

Sie erhalten das Äquivalent des Fehlers "Verzeichnis kann nicht erstellt werden".
Wenn Sie einen Zweig mit Schrägstrichen haben, wird dieser als Verzeichnishierarchie unter gespeichert .git/refs/heads.

VonC
quelle
3
Vielen Dank für die ausführliche Antwort. Interessanterweise habe ich git branch foo / bar ausprobiert (was funktioniert hat); dann git branch -d foo / bar, aber ich sehe, dass das foo / verzeichnis (jetzt leer) noch existiert! EDIT: und es wird ersetzt, sobald ich "git branch foo" mache. Alles ist gut.
1
@faB: böse ... aber nicht unerwartet: Sie haben den Balken (im fooNamespace ' ' gelöscht ), aber nicht foo(der als Namespace für einen anderen Zweig dienen oder selbst ein Zweig sein könnte)
VonC
Das ist nicht wirklich wichtig, aber Git ändert seine Haltung nicht, selbst wenn Sie anrufen. Es tut pack-refsalles, um Sie davor zu schützen.
Josh Lee
23
Um die Antwort zusammenzufassen: Sie können Schrägstriche in Zweigstellennamen haben. OP hatte bereits einen labsZweig und versuchte zu erstellen labs/feature, was Git zurückschreckte.
Duozmo
107

Es ist möglich, hierarchische Verzweigungsnamen (Verzweigungsnamen mit Schrägstrich) zu haben. Zum Beispiel habe ich in meinem Repository solche Zweige. Eine Einschränkung ist, dass Sie nicht sowohl Zweig 'foo' als auch Zweig 'foo / bar' im Repository haben können.

Ihr Problem besteht nicht darin, einen Zweig mit einem Schrägstrich im Namen zu erstellen.

$ git branch foo / bar
Fehler: Referenzreferenzen / Heads / Labs / Feature können nicht aufgelöst werden: Kein Verzeichnis
Schwerwiegend: Ref konnte nicht für Update gesperrt werden: Kein Verzeichnis

Die obige Fehlermeldung bezieht sich auf den Zweig 'labs / feature' und nicht auf 'foo / bar' (es sei denn, es handelt sich um einen Fehler beim Kopieren und Einfügen, dh Sie haben Teile der Sitzung bearbeitet). Was ist das Ergebnis von git branchoder git rev-parse --symbolic-full-name HEAD?

Jakub Narębski
quelle
1
Vielen Dank, entschuldigen Sie die Verwirrung. Ich habe zuerst ein foo / bar-Beispiel geschrieben, aber eine Fehlermeldung aus meinem eigentlichen Test eingefügt. Ich werde es nicht wieder tun :) Und entschuldige mich auch für meinen Fehler, tatsächlich hatte ich bereits einen "Labs" -Zweig.
33

Manchmal tritt dieses Problem auf, wenn Sie bereits einen Zweig mit dem Basisnamen haben.

Ich habe es versucht:

git checkout -b features/aName origin/features/aName

Leider hatte ich bereits eine Filiale mit dem Namen featuresund bekam die Ausnahme des Fragestellers.

Durch Entfernen des Zweigs wurde featuresdas Problem behoben. Der obige Befehl funktionierte.

Elbkind
quelle
32

In meinem Fall habe ich vergessen, dass es bereits einen unbenutzten labsZweig gab. Das Löschen löste das Problem:

git branch -d labs
git checkout -b labs/feature

Erläuterung:

Jeder Name kann nur ein übergeordneter Zweig oder ein normaler Zweig sein, nicht beide. Deshalb existieren die Zweige labs und labs/feature können nicht beide gleichzeitig existieren.

Der Grund für dieses Verhalten ist, dass die Zweige im Dateisystem gespeichert sind und Sie dort auch keine Datei labsund kein Verzeichnis labsauf derselben Ebene haben können.

flori
quelle
-1

Ich könnte mich irren, aber ich dachte, dass Schrägstriche nur in Filialnamen vorkommen, wenn sie sich beispielsweise auf ein Remote-Repo beziehen origin/master.

verrückt
quelle
11
Es ist durchaus möglich - und in der Tat üblich -, lokale Zweige mit '/' im Namen zu erstellen. Es ist eine übliche Methode, verwandte Zweige in einem 'Namespace' zu gruppieren.
CB Bailey
Ja, um ehrlich zu sein, das kann beim Lernen verwirrend sein, aber die Benennung kann auch nützlich sein. Andererseits, wenn ich Schrägstrich oder Bindestrich verwende, bin ich mir nicht sicher, ob es über den persönlichen Geschmack hinaus wichtig ist?
2
Git Flow verwendet diese Art von Namespace :)
Rimian