Git 브랜치 이름에 슬래시 문자 사용


222

나는 인기있는 Git 프로젝트의 어딘가에 지점이 "feature / xyz"와 같은 패턴을 가지고 있다고 확신합니다.

그러나 슬래시 문자로 분기를 만들려고하면 오류가 발생합니다.

$ 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

(내 초기 시도)와 동일한 문제 :

$ git checkout -b labs/feature

Git에서 슬래시 문자로 분기를 어떻게 만들 수 있습니까?

git  branch 

1
실제로 문제가있는 것 같습니다 HEAD. git은 귀하 HEADlabs/feature생성되지 않은 지점에 대한 링크 라고 생각합니다 . 어떻게 이런 일이 일어날 수 있었는지 모르겠지만 foo/bar, 그 기반 으로 지점을 만들려고 시도했지만 작동하지 않습니다. 어떻게 HEAD지내 셨는지 아세요?
CB Bailey

혼란스러워서 죄송합니다. "foo / bar"가 아닌 "labs / feature"가 편집 된 예입니다.

슬래시 전에 FWIW 아무것도는 아래에 디렉토리 생성합니다 .git/refs/heads당신이 할 경우, 즉 git checkout -b feature/123당신의 내부에 다음 projectRootFolder/.git/refs/heads: 디렉토리라는 이름의 디렉토리를 볼 수 있습니다 feature디렉토리 내부라는 이름의 브랜치를 볼 수 있습니다 123. 나중에 디렉토리 feature/124안에 다른 feature디렉토리 를 만들면124
Honey

:-D "실제로 HEAD"Nice one @CBBailey
Kent Bull에

답변:


222

이 스레드labs 에서와 같이 분기 가 아직 존재하지 않습니까?

파일과 이름이 같은 디렉토리를 모두 가질 수는 없습니다.

git이 기본적 으로이 작업을 수행하려고합니다.

% 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

"디렉토리를 만들 수 없습니다"라는 오류가 나타납니다.
슬래시가있는 분기가 있으면 아래에 디렉토리 계층 구조로 저장됩니다 .git/refs/heads.


3
깊이있는 답장을 보내 주셔서 감사합니다 .. Interstingly 나는 git branch foo / bar를 시도했다. git branch -d foo / bar,하지만 foo / 디렉토리 (현재 비어 있음)가 여전히 존재한다는 것을 알았습니다! 편집 : 그리고 "git branch foo"를 수행하자마자 교체됩니다. 모든 것이 잘됩니다.

1
@faB : wicked ... 그러나 예기치 않은 것은 아닙니다 : ' foo'네임 스페이스 에서 bar를 삭제 했지만 foo(다른 브랜치의 네임 스페이스 역할을하거나 브랜치 자체가 될 수는 없음)
VonC

이것은 실제로 중요하지 않지만 git은 호출 할 때도 자세를 변경하지 않으므로이 pack-refs로부터 보호 할 수 없습니다.
Josh Lee

23
답을 요약하면 : 브랜치 이름에 슬래시가있을 수 있습니다. OP는 이미 labs지점을 가지고 있었고 labs/featuregit balked 을 만들려고 했습니다.
duozmo

107

계층 적 분기 이름 (슬래시가있는 분기 이름)을 가질 수 있습니다. 예를 들어 내 저장소에는 그러한 지점이 있습니다. 한 가지주의 사항은 저장소에 분기 'foo'와 분기 'foo / bar'를 모두 가질 수 없다는 것입니다.

문제는 이름에 슬래시가있는 분기를 만드는 것이 아닙니다.

$ 자식 분기 foo / bar
오류 : 참조 참조 / 헤드 / 랩 / 기능을 해결할 수 없습니다 : 디렉토리가 아닙니다
치명적 : 업데이트에 대한 참조를 잠그지 못했습니다. 디렉토리가 아님

위의 오류 메시지는 'foo / bar'가 아닌 'labs / feature'브랜치에 대해 설명합니다 (copy'n'paste에서 실수가 아닌 한 세션의 일부를 편집 한 경우 제외). git branch또는 의 결과는 무엇입니까 git rev-parse --symbolic-full-name HEAD?


1
고마워, 혼란에 대해 미안, 나는 먼저 foo / bar 예제를 작성했지만 실제 테스트에서 오류 메시지를 붙여 넣습니다. 다시하지 않습니다 :) 그리고 실수로 죄송합니다. 실제로 "labs"분기가 이미 있습니다.

33

기본 이름을 가진 분기가 이미있는 경우 때때로이 문제가 발생합니다.

나는 이것을 시도했다 :

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

불행히도, 나는 이미이라는 지점을 가지고 있었고 features질문 질문을 제외하고는.

지점을 제거하면 features문제가 해결되고 위의 명령이 작동했습니다.


32

제 경우에는 이미 사용하지 않는 labs지점 이 있다는 것을 잊었습니다 . 삭제하면 문제가 해결되었습니다.

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

설명:

이름 은 상위 분기 또는 일반 분기 일 수 있으며 둘다는 아닙니다. 그것이 가지 labs labs/feature 동시에 존재하지 않는 이유 입니다.

이 동작의 이유는 브랜치가 파일 시스템에 저장되어 있기 때문에 파일 labs과 디렉토리 labs를 같은 수준으로 가질 수 없기 때문 입니다.


-1

나는 틀릴 수 있지만 슬래시가 원격 저장소와 관련이있을 때 분기 이름에만 나타납니다 origin/master.


11
이름에 '/'를 사용하여 로컬 분기를 만드는 것이 가능하며 실제로는 가능합니다. 관련 브랜치를 '네임 스페이스'로 그룹화하는 일반적인 방법입니다.
CB Bailey

예, 배우면 혼란 스러울 수 있지만, 이름도 유용 할 수 있습니다. 그런 다음 슬래시 또는 대시를 다시 사용하여 개인적인 취향을 넘어서는 것이 확실하지 않은가요?

2
git flow는 이런 스타일의 네임 스페이스를 사용합니다 :)
Rimian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.