Usando o caractere de barra no nome do ramo Git

222

Tenho certeza de que vi em algum lugar de um projeto popular do Git que os ramos tinham um padrão como "feature / xyz".

No entanto, quando tento criar um ramo com o caractere de barra, recebo um erro:

$ 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

Mesmo problema para (minha tentativa inicial):

$ git checkout -b labs/feature

Como alguém cria uma ramificação no Git com o caractere de barra?


fonte
1
Na verdade, parece que você tem problemas com o seu HEAD. Parece que o git pensa que você HEADé um link para o ramo labs/featureque não foi criado. Não tenho ideia de como isso poderia ter acontecido, mas significa que sua tentativa de criar um ramo chamado com foo/barbase nele não está funcionando. Alguma idéia de como você HEADse soltou?
CB Bailey
Sinto muito pela confusão, seus "labs / feature", não "foo / bar", exemplo editado.
FWIW qualquer coisa antes da barra irá gerar um diretório, .git/refs/headsou seja, se você fizer git checkout -b feature/123isso dentro do projectRootFolder/.git/refs/headsdiretório, verá um diretório chamado: featureonde dentro desse diretório, você verá uma ramificação chamada 123. Posteriormente, se você criar outro feature/124dentro do featurediretório, verá um ramo chamado124
Honey
:-D "Na verdade, parece que você está com um problema com o seu HEAD" Legal "@CBBailey
Kent Bull

Respostas:

222

Você tem certeza de que o ramo labsainda não existe (como neste tópico )?

Você não pode ter um arquivo e um diretório com o mesmo nome.

Você está tentando fazer com que o git faça basicamente isso:

% 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

Você está recebendo o equivalente ao erro "Não é possível criar diretório".
Quando você tem uma ramificação com barras, ela é armazenada como uma hierarquia de diretórios .git/refs/heads.

VonC
fonte
3
Obrigado pela resposta detalhada. Interessantemente tentei git branch foo / bar (que funcionou); então git branch -d foo / bar, mas vejo que o diretório foo / (agora vazio) ainda existe! EDIT: e é substituído assim que eu "git branch foo". Tudo está bem.
1
@faB: mau ... mas não inesperado: você excluiu bar (no ' foo' namespace), mas não foo(que poderia servir como um espaço de nomes para outro ramo ou ser um ramo próprio)
VonC
Isso realmente não importa, mas o git não muda sua postura mesmo quando você liga pack-refs, por isso está se esforçando para protegê-lo disso.
Josh Lee
23
Para resumir a resposta: Você pode ter barras nos nomes das filiais. O OP já tinha um labsramo e tentou criar labs/feature, no qual o git recusou.
duozmo
107

É possível ter nomes de ramificação hierárquica (nomes de ramificação com barra). Por exemplo, no meu repositório, tenho essas ramificações. Uma ressalva é que você não pode ter a ramificação 'foo' e a ramificação 'foo / bar' no repositório.

Seu problema não é com a criação de ramificação com barra no nome.

$ git ramo foo / bar
erro: incapaz de resolver refs / heads / labs / feature de referência: Não é um diretório
fatal: falha ao bloquear ref para atualização: não é um diretório

A mensagem de erro acima fala sobre a ramificação 'labs / feature', não sobre 'foo / bar' (a menos que seja um erro no copy'n'paste, ou seja, você editou partes da sessão). Qual é o resultado de git branchou git rev-parse --symbolic-full-name HEAD?

Jakub Narębski
fonte
1
Obrigado, desculpe-me pela confusão, primeiro escrevi um exemplo foo / bar, mas colei a mensagem de erro do meu teste real. Não farei isso novamente :) E desculpe também pelo meu erro, na verdade eu já tinha um ramo de "laboratórios".
33

Às vezes, esse problema ocorre se você já possui uma ramificação com o nome base.

Eu tentei isso:

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

Infelizmente, eu já tinha um ramo chamado featurese recebi a exceção do solicitante de pergunta.

A remoção da ramificação featuresresolveu o problema, o comando acima funcionou.

elbkind
fonte
32

No meu caso, esqueci que já havia um labsramo não utilizado . Excluí-lo resolveu o problema:

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

Explicação:

Cada nome pode ser apenas um ramo pai ou um ramo normal, não ambos. É por isso que os ramos labs e labs/feature não podem existir os dois ao mesmo tempo.

O motivo desse comportamento é que as ramificações são armazenadas no sistema de arquivos e também não é possível ter um arquivo labse um diretório labsno mesmo nível.

flori
fonte
-1

Eu poderia estar errado, mas achei que as barras só apareciam nos nomes das filiais quando se relacionavam a um repositório remoto, por exemplo origin/master.

crazyscot
fonte
11
É perfeitamente possível - e de fato comum - criar ramificações locais com '/' em seus nomes. É uma maneira comum de agrupar ramificações relacionadas em um 'espaço para nome'.
CB Bailey
Sim, para ser sincero, pode ser confuso ao aprender, mas a nomeação também pode ser útil. Então, novamente usando barra ou traço, não tenho certeza se isso importa além do gosto pessoal?
2
fluxo git usa este estilo de namespacing :)
Rimian