git describe가 "치명적 : 이름을 찾을 수 없음, 아무것도 설명 할 수 없음"과 함께 실패합니다.


82

Ubuntu 10.10 amd64에서 git 1.7.1을 사용하고 있으며 내 프로젝트로 컴파일하는 자동화 된 버전 정보에서 사용하기 위해 내 저장소 HEAD의 해시를 추출하려고합니다.

과거에는 항상

git describe --tags

그러나 git은 이제 던지고 있습니다.

fatal: No names found, cannot describe anything.

나 한테. 그게 무슨 뜻인지 아는 사람 있나요?

Google은 조회수가 거의없고 해결책이 없습니다.


실제로 해시 만 원합니까, 아니면 git describe로 모아 놓은 정보가 유용합니까? 가장 최근의 태그와 중간 커밋 수는 SHA1보다 훨씬 더 읽기 쉽습니다. @nes : OP에 정확히 필요한 것이기 때문에 답변 삭제를 취소하고 싶을 수 있습니다. 말하기 어렵습니다.
Cascabel

개인 알림 : 리모컨에 실제로 사용하는 태그가 있는지 확인하십시오 git ls-remote --tags. 제 경우에는 repo가 ​​최근에 새 서버로 마이그레이션되었고 태그는 아직 전송되지 않았습니다!
Gabriel Devillers 2019

답변:


71

당신이 당신의 ID를 원한다면 HEAD당신은 필요하지 않습니다 describe, 당신은 사용해야 rev-parse합니다.

git rev-parse HEAD

축약 된 해시를 원하면 --short.

git rev-parse --short HEAD

적절한 태그를 찾을 수없는 경우 "describe"가 축약 된 해시로 대체되도록하려면을 사용할 수 있습니다 --always.

git describe --always

네, 그것은 해시를 반환합니다. 그러나 제가 간결하게 원하는 것은 8 자 정도의 git-describe에 의해 일반적으로 반환되는 축약 된 해시입니다
Philipp

1
@Philipp : git describe일반적으로 태그 이름, 커밋 수 및 해시를 기반으로 한 접미사로 구성된 태그 개체 기반 문자열을 반환합니다. 일반적으로 축약 된 해시를 반환하지 않으므로 무엇을 요구하는지 잘 모르겠습니다.
CB Bailey

37

git-describe가장 최근의 태그와 해당 태그 이후의 커밋 수를 포함 할 것으로 예상 하는 것 같습니다. 그러나 fatal: No names found메시지는 저장소에 태그가 없음을 의미 합니다. git describe최신 태그를 알려주 려면 커밋 기록에 적어도 하나의 태그가 있어야합니다 .

추측 만했지만 다른 곳에서 커밋에 태그를 지정했지만 태그를 업스트림으로 푸시하지 않았을 수 있습니다 (커밋을 업스트림으로 푸시하고 나중에 태그를 지정하고 리 푸시하지 않았습니까?). 이제 업스트림의 새 복제본이이 오류를 제공합니다 (태그가 없기 때문에). 이 경우 git push --tags원하는 태그가있는 저장소에서 시도 할 수 git describe있습니다 (예상 되는 작업을 수행하는 위치 ). 그런 다음 git pull태그가없는 저장소에서 수행하십시오.


37

CI 도구가 저장소의 얕은 복제를 수행하는 CI 빌드 환경에서이 문제가 발생했습니다. 내 개발 환경에서 명령이

git describe --tags

나에게 다음과 같은 출력을 줄 것이다.

2.2.12-7-g8ec9d6c9

빌드 환경에서는 "치명적인 이름을 찾을 수 없음"오류가 발생합니다. --always 태그를 사용해 본 경우

git describe --tags --always

그런 다음 단순히 최신 커밋의 해시를 가져 오지만 해당 커밋 이전의 가장 최근 태그는 가져 오지 않습니다.

8ec9d6c9

수행 git pull빌드 환경에서를 것은 도움이되지 않을 것입니다. 리포지토리가 얕게 복제 된 후에는 향후 pull이 태그를 업데이트하지 않기 때문입니다.

해결책은 빌드 환경에서 저장소의 초기 복제본이 얕은 복제본이 아닌지 확인하는 것이 었습니다 (예 : git clone명령이 --depth, --shallow-since또는 --shallow-exclude매개 변수 와 함께 사용되지 않음 ).


당신의 통찰력에 감사드립니다!
Terenoth

5
추가 git fetch --depth=500는 Travis-CI에서 나를 위해 일했습니다.
Matt Wilkie

그게 제가 원했던 대답입니다!
serkef

- 네이 추가 .travis.yml: 나를 위해 그것을 고정git: depth: false
shacker

1
또한 git fetch --tags얕은 클론에서 누락 된 태그를 가져올 수도 있습니다.
Luke H

17

이는 저장소에 태그가없는 경우 발생합니다. 저장소 태그가, 당신은 (이 TravisCI 또는 GitHub의 작업과 같은 CI 시스템의 기본입니다) 얕은 클론에있어.

얕은 클론 내에서 기록 (태그 포함)을 가져 오려면 다음을 실행합니다.

git fetch --prune --unshallow

예를 들어 GitHub 작업의 경우 :

- uses: actions/checkout@v2
- run: git fetch --prune --unshallow

나중에 git describe다시 작동합니다.


2
GitHub Actions의 --tags경우 제 경우에는 필요했습니다 git fetch --prune --unshallow --tags. 참고 이 문제를
U-사위

1
이것이 작동하고 Github Workflows의 얕은 저장소에 대한 문제를 해결하지만 실제로 저장소의 전체 기록을 가져올 수는 없습니까? 기록이 많은 큰 저장소는 CI 파이프 라인에 병목 현상을 추가하여 문제를 유발합니다.
Norman Pellet

1
예, 이것은 전체 역사를 가져올 것입니다. 태그는 개정판에 대한 포인터이므로 태그가 제대로 작동하려면 해당 개정판이 있어야합니다.
Danilo Bargen

5

CI 작업에서 작업하는 동안 비슷한 문제가 있었는데 문제는 git clone 또는 checkout scm가 저장소를 복제하는 동안 태그를 가져 오지 못했습니다.

태그없이 가져 오기 https : // github . ********** 에서 업스트림 변경 사항 가져 오기

"고급 복제 동작"을 선택한 다음 태그 가져 오기를 클릭하여 가져 오기 태그를 활성화 할 수 있습니다.

Screenshot_enabling_git_fetch


1

Travis CI의이 오류 메시지로 인해 여기에 온 경우 다음 설정을 사용하여 얕은 복제를 방지 할 수 있습니다.

git:
  depth: false

테스트 git fetch --tags했지만 작동하지 않았습니다.


0

이 명령은 나를 도왔습니다. git fetch -t


11
더 많은 정보로 편집하십시오. 코드 전용 및 "시도"답변은 검색 가능한 콘텐츠가 포함되어 있지 않고 누군가 "이것을 시도"해야하는 이유를 설명하지 않기 때문에 권장 하지 않습니다.
릭 스미스

간결하게 말하면 이것은를 언급하는 유일한 답변입니다 fetch.
Bjoern Dahlgren

OP의 문제는 그의 로컬 저장소에 태그가 없다는 것입니다. 원격에는 있지만 로컬에는없는 경우 git fetch -t 또는 git fetch --tags
Wolfgang

이 명령은 내 문제도 실제로 해결했으며 다른 응답은 없었습니다.
Marcos Fernandez Ramos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.