Używanie znaku ukośnika w nazwie gałęzi Git


222

Jestem prawie pewien, że widziałem gdzieś w popularnym projekcie Git, gałęzie miały wzór podobny do „feature / xyz”.

Jednak gdy próbuję utworzyć gałąź ze znakiem ukośnika, pojawia się błąd:

$ 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

Ten sam problem dla (mojej pierwszej próby):

$ git checkout -b labs/feature

Jak stworzyć gałąź w Git z ukośnikiem?

git  branch 

1
Wygląda na to, że masz problem ze swoim HEAD. Wygląda na to, że git uważa, że HEADjest to link do gałęzi, labs/featurektóra nie została utworzona. Nie mam pojęcia, jak to się mogło stać, ale oznacza to, że próba utworzenia oddziału zwanego na jego foo/barpodstawie nie działa. Masz pomysł, jak się HEADutknąłeś?
— CB Bailey

Przepraszam za zamieszanie, jego „labs / feature”, a nie „foo / bar”, zredagowany przykład.

FWIW cokolwiek przed ukośnikiem wygeneruje katalog pod, .git/refs/headstzn. Jeśli to zrobisz, git checkout -b feature/123w projectRootFolder/.git/refs/headskatalogu zobaczysz katalog o nazwie: featuregdzie w tym katalogu zobaczysz gałąź o nazwie 123. Później, jeśli utworzysz kolejną, feature/124a następnie w featurekatalogu, zobaczysz gałąź o nazwie124
— Honey

:-D „Wygląda na to, że masz problem ze swoim HEAD” Nice one @CBBailey
— Kent Bull

Odpowiedzi:


222

Czy jesteś pewien, że gałąź labsjuż nie istnieje (jak w tym wątku )?

Nie możesz mieć zarówno pliku, jak i katalogu o tej samej nazwie.

Próbujesz zmusić gita do zrobienia tego w zasadzie:

% 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

Otrzymujesz odpowiednik błędu „nie można utworzyć katalogu”.
Kiedy masz gałąź z ukośnikami, jest ona przechowywana jako hierarchia katalogów w .git/refs/heads.


3
Dzięki za dogłębną odpowiedź. Interesująco próbowałem git branch foo / bar (który zadziałał); potem git branch -d foo / bar, ale widzę, że katalog foo / (teraz pusty) wciąż istnieje! EDYCJA: i jest zastępowane, jak tylko zrobię „git branch foo”. Wszystko dobrze.

1
@faB: zły ... ale nie jest nieoczekiwany: usunąłeś pasek (w fooprzestrzeni nazw), ale nie foo(który mógłby służyć jako przestrzeń nazw dla innej gałęzi lub być samą gałęzią)
— VonC

To naprawdę nie ma znaczenia, ale git nie zmienia swojej pozycji, nawet gdy dzwonisz pack-refs, więc robi wszystko, aby cię przed tym chronić.
— Josh Lee

23
Podsumowując odpowiedź: możesz mieć ukośniki w nazwach gałęzi. OP miał już labsgałąź i próbował stworzyć labs/feature, na co git się bał.
— duozmo

107

Możliwe jest posiadanie hierarchicznych nazw gałęzi (nazwy gałęzi z ukośnikiem). Na przykład w moim repozytorium mam takie oddziały. Jednym zastrzeżeniem jest to, że nie możesz mieć zarówno gałęzi „foo”, jak i gałęzi „foo / bar” w repozytorium.

Twój problem nie polega na tworzeniu gałęzi z ukośnikiem w nazwie.

$ git branch foo / bar
błąd: nie można rozpoznać referencji / heads / labs / feature: To nie jest katalog
fatal: Nie udało się zablokować referencji dla aktualizacji: Brak katalogu

Powyższy komunikat o błędzie mówi o gałęzi „labs / feature”, a nie „foo / bar” (chyba że jest to błąd w kopiowaniu i wklejaniu, tzn. Edytowałeś części sesji). Jaki jest wynik git branchlub git rev-parse --symbolic-full-name HEAD?


1
Dzięki, przepraszam za zamieszanie, najpierw napisałem przykład foo / bar, ale wkleiłem komunikat o błędzie z mojego rzeczywistego testu. Nie zrobię tego ponownie :) I przepraszam również za mój błąd, rzeczywiście miałem już oddział „labs”.

33

Czasami ten problem występuje, jeśli masz już gałąź o nazwie podstawowej.

Próbowałem tego:

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

Niestety miałem już oddział o nazwie featuresi dostałem wyjątek z pytającym.

Usunięcie gałęzi featuresrozwiązało problem, powyższe polecenie działało.


32

W moim przypadku zapomniałem, że istniała już nieużywana labsgałąź. Usunięcie go rozwiązało problem:

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

Wyjaśnienie:

Każda nazwa może być tylko gałęzią nadrzędną lub normalną, a nie jedną i drugą. To dlatego rozgałęzia się labs i labs/feature nie może istnieć jednocześnie.

Przyczyną takiego zachowania jest to, że gałęzie są przechowywane w systemie plików i tam też nie można mieć pliku labsi katalogu labsna tym samym poziomie.


-1

Mogłem się mylić, ale myślałem, że ukośniki pojawiają się tylko w nazwach gałęzi, gdy dotyczą na przykład zdalnego repo origin/master.


11
Jest całkowicie możliwe - i rzeczywiście powszechne - tworzenie lokalnych oddziałów z „/” w ich nazwach. Jest to powszechny sposób grupowania powiązanych gałęzi w „przestrzeni nazw”.
— CB Bailey

Tak, szczerze mówiąc, może to być mylące podczas nauki, ale nazewnictwo może być również przydatne. Z drugiej strony używając ukośnika lub myślnika, nie jestem pewien, czy to ma znaczenie poza osobistym gustem?

2
git flow używa tego stylu przestrzeni nazw :)
— Rimian 11.11
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.