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.