Usando il carattere barra nel nome del ramo Git


222

Sono abbastanza sicuro di aver visto da qualche parte in un popolare progetto Git che i rami avevano uno schema come "feature / xyz".

Tuttavia, quando provo a creare un ramo con il carattere barra, ricevo un errore:

$ 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

Stesso problema per (il mio tentativo iniziale):

$ git checkout -b labs/feature

Come si crea un ramo in Git con il carattere barra?

git  branch 

1
In realtà sembra che tu abbia problemi con il tuo HEAD. Sembra che Git pensi che il tuo HEADsia un collegamento al ramo labs/featureche non è stato creato. Non ho idea di come sia potuto succedere, ma significa che il tuo tentativo di creare un ramo chiamato foo/barbasato su di esso, non funziona. Hai idea di come ti sei HEADsbloccato?
CB Bailey,

Mi dispiace per la confusione, i suoi "lab / feature", non "foo / bar", esempio modificato.

FWIW qualsiasi cosa prima della barra genererà una directory sotto, ad .git/refs/headsesempio se git checkout -b feature/123nella tua projectRootFolder/.git/refs/headsdirectory vedrai una directory chiamata: featuredove all'interno di quella directory vedrai un ramo chiamato 123. Più tardi, se ne crei un altro e feature/124poi all'interno della featuredirectory, vedrai un ramo chiamato124
Honey

MrGreen "In realtà sembra che tu abbia un problema con il tuo HEAD" Nice one @CBBailey
Kent Bull

Risposte:


222

Sei sicuro che il ramo labsnon esista già (come in questo thread )?

Non puoi avere sia un file che una directory con lo stesso nome.

Stai cercando di ottenere git per fare sostanzialmente questo:

% 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

Stai ottenendo l'equivalente dell'errore "impossibile creare la directory".
Quando si dispone di un ramo con barre, viene archiviato come gerarchia di directory in .git/refs/heads.


3
Grazie per la risposta approfondita. Interstamente ho provato git branch foo / bar (che ha funzionato); quindi git branch -d foo / bar, ma vedo che la directory foo / (ora vuota) esiste ancora! EDIT: e viene sostituito non appena faccio "git branch foo". Tutto bene.

1
@faB: malvagio ... ma non inaspettato: hai cancellato la barra (nello foo"spazio dei nomi"), ma non foo(che potrebbe servire come spazio dei nomi per un altro ramo o essere un ramo stesso)
VonC

Questo non ha molta importanza, ma git non cambia la sua posizione anche quando chiami pack-refs, quindi fa di tutto per proteggerti da questo.
Josh Lee,

23
Per riassumere la risposta: è possibile avere delle barre nei nomi dei rami. OP aveva già un labsramo e ha cercato di creare labs/feature, che git ha esitato.
duozmo,

107

È possibile avere nomi di rami gerarchici (nomi di rami con barra). Ad esempio nel mio repository ho tali rami. Un avvertimento è che non è possibile avere sia il ramo 'foo' che il ramo 'foo / bar' nel repository.

Il tuo problema non è con la creazione di un ramo con una barra nel nome.

$ git branch foo / bar
errore: impossibile risolvere i riferimenti di riferimento / head / labs / feature: non una directory
fatale: impossibile bloccare ref per l'aggiornamento: non una directory

Il messaggio di errore sopra riportato parla del ramo 'lab / feature', non di 'foo / bar' (a meno che non sia un errore nel copia e incolla, cioè hai modificato parti della sessione). Qual è il risultato di git brancho git rev-parse --symbolic-full-name HEAD?


1
Grazie, scusa per la confusione, ho prima scritto un esempio foo / bar, ma ho incollato un messaggio di errore dal mio test reale. Non lo farò più :) E scusami anche per il mio errore, anzi avevo già un ramo "lab".

33

A volte questo problema si verifica se hai già un ramo con il nome di base.

Ho provato questo:

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

Sfortunatamente, avevo già un ramo chiamato featurese ho ottenuto l'eccezione della domanda.

La rimozione del ramo ha featuresrisolto il problema, il comando sopra ha funzionato.


32

Nel mio caso, ho dimenticato che c'era già un labsramo inutilizzato . L'eliminazione ha risolto il problema:

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

Spiegazione:

Ogni nome può essere solo un ramo padre o un ramo normale, non entrambi. Ecco perché i rami labs e labs/feature non possono esistere entrambi allo stesso tempo.

Il motivo di questo comportamento è che i rami sono archiviati nel file system e lì non è possibile avere un file labse una directory labsallo stesso livello.


-1

Potrei sbagliarmi, ma pensavo che le barre apparissero nei nomi dei rami solo quando si riferivano a un repository remoto, per esempio origin/master.


11
È perfettamente possibile - e anzi comune - creare filiali locali con '/' nei loro nomi. È un modo comune di raggruppare i rami correlati in uno "spazio dei nomi".
CB Bailey,

Sì, a dire il vero, può essere fonte di confusione durante l'apprendimento, ma la denominazione può essere utile. Quindi di nuovo usando la barra o il trattino, non sono sicuro che sia importante oltre il gusto personale?

2
git flow usa questo stile di namespace :)
Rimian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.