복잡한 Git 브랜치 이름으로 모든 Git 명령이 중단됨


338

master다음 명령 으로 지점을 만들려고했습니다 .

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

Git이 갑자기 응답을 멈췄을 때 나는 이스케이프되지 않은 사람들 ()이 어떻게 든 책임을 져야한다고 생각한다 . 이제 Git 명령을 실행할 때마다 동일한 오류가 발생합니다.

git:176: command not found: _of_ProductSearchQuery

git명령을 입력 할 때마다 숫자가 증가한 후

아무도 무슨 일이 있었는지 설명 할 수 있습니까? 그리고 어떻게 정상으로 돌아 갑니까? 해당 지점을 삭제하고 싶지만 어떻게 할 수 있습니까?


8
나는 (13.10 루 분투) 어떤 나쁜 부작용 내 bash 쉘에있는 지점을 만들 실행 할 수 있었다으로 이것이 당신의 zsh을 환경과 관련된 거라 생각하지만, 내가 완전히 바닐라 zsh을로 전환 할 때 오류를보고 있어요
Jonathan.Brink

27
앞으로는 의심스러워 보이는 것을 인용하십시오. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"잘 작동합니다.
Qix-MONICA가

11
@Qix 문제가있는 문자를 모두 피하는 것이 좋습니다.
jub0bs

3
@Jubobs 확실히 특정 회사에서는 이와 같은 이상한 지점 이름을 사용하는 것을 보았습니다.
Qix-MONICA가

1
@DwightSpencer 귀하의 링크는 Bash에만 해당되지만이 질문은 zsh에만 해당됩니다. Bash에서는 실제로 문제가 발생하지 않습니다.
jub0bs

답변:


617

문제

아무도 무슨 일이 있었는지 설명 할 수 있습니까? [...] 해당 지점을 삭제할 수 있기를 원하지만 Git은 작동하지 않습니다.

실행하여

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

zsh에서는 분기를 작성하지 않았습니다 . 대신, 실수로 세 가지 정의 쉘 기능 이라고 git, branch그리고 SSLOC-201_Implement___str__몸 자신의 매개 변수 (있는 경우)를 무시 _of_ProductSearchQuery. functions모든 기존 쉘 함수를 나열 하는 내장 zsh 명령을 호출하여 실제로 발생한 일인지 확인할 수 있습니다 .

$ functions                                                     
SSLOC-201_Implement___str__ () {
    _of_ProductSearchQuery
}
branch () {
    _of_ProductSearchQuery
}
git () {
    _of_ProductSearchQuery
}

불행히도, 다른 두 쉘 함수에는 문제가 없지만 "git"이라는 쉘 함수는 이제 bona fide git 명령을 어둡게합니다 !

$ which git
git () {
    _of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)

따라서 나중에 오류가 발생합니다

command not found: _of_ProductSearchQuery

당신이 망할 놈의 명령을 실행하려고 할 때마다 예를 들어 git log, git status등 (가정, 물론,라는 어떤 명령은 _of_ProductSearchQuery존재하지 않는다).

사이드 노트

[...] 같은 오류가 발생합니다.

git:176: command not found: _of_ProductSearchQuery

( git명령을 입력 할 때마다 숫자가 증가한 후 )

이 숫자는 단순히 HISTCMD환경 변수 인의 값에 해당합니다.

대화식 쉘의 현재 히스토리 이벤트 번호, 즉 명령을 $HISTCMD읽은 명령의 이벤트 번호 .

자세한 내용은 zsh 매뉴얼 을 참조하십시오.

해결책

그리고 어떻게 정상으로 돌아 갑니까?

문제가있는 쉘 기능과 실수로 생성 한 다른 기능을 삭제하면됩니다.

unset -f git
unset -f branch SSLOC-201_Implement___str__

그렇다면 모든 것이 잘되어야합니다.

unset그림자도 있다면 어떨까요 ?!

좋은 질문입니다 ! 나는 당신을 참조 wumpus 사 W. Wumbley의 우수한 주석 아래.


지점 이름 지정 팁

특별한 쉘 문자를 피하십시오

주석에서 지적했듯이 괄호는 Git 브랜치 이름에 유효한 문자입니다. 이름을 적절하게 인용하면됩니다. 예 :

$ git branch 'foo()bar'
$ git branch
  foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'

그러나 명령 행 인수로 사용될 때 마다 이러한 이름을 인용 할 필요가 있으면 참조 이름에서 괄호를 피해야합니다. 보다 일반적으로, 쉘에서 특별한 의미를 갖는 문자는 피해야합니다.

간단한 분기 이름 사용

어쨌든 지점 이름은 짧고 달콤해야합니다. 같은 긴 설명

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

분기 이름이 아닌 커밋 메시지에 속합니다.


4
그 스레드 상태의 parens는 불법이 아닙니다. 힘내는 그것을 좋아 좋아 보였다. Switched to a new branch 'abcd-()-foo'
Qix-MONICA가

1
좋아 보인다; 그것들을 사용하는 것은 좋은 생각은 아니지만 기술적으로 유효 하지는 않습니다.
Qix-MONICA가

12
누군가 unset소위 쉘 함수를 생성하여 그림자 를 만들면 어떻게됩니까 ?
Matteo Umili

2
@codroipo 하! 그건 좋은 지적이야. 그렇습니다. 가능하면 다시 시작하는 것이 좋습니다 zsh.
jub0bs

45
사용할 수 있습니다 builtin unset. 경우 builtin와 것은 unset모두 다음, 함수에 의해 그림자가되어 있습니다 unfunction. 그것도 사라 졌다면 unhash -f. 4 개가 모두 사라지면 쉘 다시 시작하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.