Git에서 tree-ish는 무엇을 의미합니까?


122

사용 방법에 대해 매우 혼란 스럽습니다 git archive.

최상위 수준에 Foo , BarBaz 폴더가있는 git 저장소가 있습니다. 빠른 테스트 배포를 위해 Foo 폴더를 SVN 방식으로 내 보내야합니다.

내가 사용할 수있는 것을 알게 git-archive에서 방법의 SVN 틱 수출 정렬 .

그러나 여기에 다음이 잘 작동합니다.

git archive master | tar -x -C ~/destination

대상 폴더 에 Foo , Bar , Baz 폴더가 생성됩니다 .

그러나, 다음은 밖으로 오류가 발생하지fatal not a valid object name:

git archive master/foo | tar -x -C ~/destination

문서

git archive프로그램 의 시놉시스를 살펴보면 <tree-ish> [path]매개 변수로 사용할 수 있음을 알 수 있습니다 (관련 부분에 요약 된 시놉시스).

git archive <tree-ish> [path...]

하면 master/foo 되지 tree-ish, 무슨 다음?


2
master:foo나무 같지만 master fooi로 사용 하는 것이 좋습니다 <tree-ish> <path>.
Jakub Narębski

1
나는 <tree-ish>를 [path]의 형용사로 해석했다. 그것이 내가 잘못한 곳입니다. 그리고 내가 본 모든 예제는 명령의 <tree-ish> 부분 만 사용했기 때문에 '<tree-ish> 경로를 사용하고 있다고 잘못 가정했습니다. 오 의미론 :)
dkinzer


3
제목이 git에있는 tree-ish가 무엇인지 묻지 만 시작하고 주로 일부 명령에 관한 것처럼 보이기 때문에이 질문에 문제가 있습니다. 또한, 받아 들여지는 대답은 tree-ish라는 용어가 정확히 의미하는 바를 다루지 않는 것 같습니다. 질문 제목을 변경하거나 질문을 변경해야합니다. 나는 제목이 질문의 실제 사례와 수용된 대답이 무엇인지에 더 잘 적응할 것을 제안합니다. 또는 질문 제목이 실제로 무엇인지에 대한 수락 된 답변을 변경할 수도 있습니다. 또는 대답은 질문 제목을 다루어야합니다.
Charlie Parker

@CharlieParker는 git archive명령에 대한 man 페이지가 더 이상 tree-ish를 참조하지 않지만 내가이 질문을했을 때 그들은 그렇게했습니다. 그리고 받아 들여진 대답에 관하여; 그 당시에는 아무도 질문에 답하지 않았습니다. 2 년이 지난 후 또 다른 답변이 게시되었습니다.
dkinzer 2014-06-26

답변:


166

짧은 답변 (TL; DR)

"Tree-ish"는 궁극적으로 (하위) 디렉토리 트리 (Git는 디렉토리를 "트리"및 "트리 객체"라고 함)로 이어지는 모든 식별자 ( Git 개정 문서에 지정됨)를 참조하는 용어입니다 .

원래 포스터의 경우 지정하려는 foo 디렉토리 입니다. Git에서 (하위) 디렉토리를 지정하는 올바른 방법은이 "tree-ish"구문을 사용하는 것입니다 ( Git 개정 문서의 항목 # 15 ).

<rev>:<path>예를 들면 HEAD:README, :README,master:./README

접미사 :뒤에 경로가 있으면 콜론 앞 부분에 의해 명명 된 tree-ish 개체의 지정된 경로에있는 blob 또는 트리의 이름이 지정됩니다.

즉, master:foo올바른 구문이 아니라 master/foo.

기타 "트리 스타일"(더하기 커밋)

다음은 commit-ish 및 tree-ish 식별자의 전체 목록입니다 ( Git 개정 문서 에서 지적한 LopSae 덕분에 ).

----------------------------------------------------------------------
|    Commit-ish/Tree-ish    |                Examples
----------------------------------------------------------------------
|  1. <sha1>                | dae86e1950b1277e545cee180551750029cfe735
|  2. <describeOutput>      | v1.7.4.2-679-g3bee7fb
|  3. <refname>             | master, heads/master, refs/heads/master
|  4. <refname>@{<date>}    | master@{yesterday}, HEAD@{5 minutes ago}
|  5. <refname>@{<n>}       | master@{1}
|  6. @{<n>}                | @{1}
|  7. @{-<n>}               | @{-1}
|  8. <refname>@{upstream}  | master@{upstream}, @{u}
|  9. <rev>^                | HEAD^, v1.5.1^0
| 10. <rev>~<n>             | master~3
| 11. <rev>^{<type>}        | v0.99.8^{commit}
| 12. <rev>^{}              | v0.99.8^{}
| 13. <rev>^{/<text>}       | HEAD^{/fix nasty bug}
| 14. :/<text>              | :/fix nasty bug
----------------------------------------------------------------------
|       Tree-ish only       |                Examples
----------------------------------------------------------------------
| 15. <rev>:<path>          | HEAD:README, :README, master:./README
----------------------------------------------------------------------
|         Tree-ish?         |                Examples
----------------------------------------------------------------------
| 16. :<n>:<path>           | :0:README, :README
----------------------------------------------------------------------

식별자 # 1-14는 모두 "커밋 방식"입니다. 모두 커밋으로 이어지지 만 커밋도 디렉토리 트리를 가리 키기 때문에 모두 궁극적으로 (하위) 디렉터리 트리 개체로 이어 지므로 "트리로도 사용할 수 있습니다." -ish ".

# 15는 (하위) 디렉토리를 참조 할 때 tree-ish로도 사용할 수 있지만 특정 파일을 식별하는데도 사용할 수 있습니다. 파일을 참조 할 때 여전히 "트리 다운"으로 간주되는지 또는 "blob-ish"와 비슷하게 작동하는지 확실하지 않습니다 (Git는 파일을 "blobs"라고 함).

긴 답변

가장 낮은 수준에서 Git은 네 가지 기본 개체를 사용하여 소스 코드를 추적합니다.

  1. 커밋을 가리키는 주석이 달린 태그.
  2. 프로젝트의 루트 디렉토리 트리를 가리키는 커밋.
  3. 디렉터리 및 하위 디렉터리 인 트리.
  4. 파일 인 Blob.

Linus Torvalds가 콘텐츠 주소 지정이 가능한 파일 시스템 처럼 Git을 설계했기 때문에 이러한 각 개체에는 자체 sha1 해시 ID 가 있습니다. 즉, 콘텐츠를 기반으로 파일을 검색 할 수 있습니다 (sha1 ID는 파일 콘텐츠에서 생성됨). Pro Git 책은 다음 예제 다이어그램을 제공 합니다 .

Pro Git 책의 그림 9-3

많은 Git 명령은 커밋 및 (하위) 디렉터리 트리에 대한 특수 식별자를 허용 할 수 있습니다.

  • "Commit-ish"는 궁극적으로 커밋 객체로 연결되는 식별자입니다. 예를 들면

    tag -> commit

  • "Tree-ish"는 궁극적으로 트리 (즉, 디렉토리) 객체로 이어지는 식별자입니다.

    tag -> commit -> project-root-directory

커밋 개체는 항상 디렉터리 트리 개체 (프로젝트의 루트 디렉터리)를 가리 키기 때문에 "commit-ish"인 식별자는 정의상 "tree-ish"이기도합니다. 즉, 커밋 개체로 연결되는 모든 식별자를 사용하여 (하위) 디렉터리 트리 개체로 연결될 수도 있습니다. .

그러나 디렉토리 트리 객체는 Git의 버전 관리 시스템에서 커밋을 가리 키지 않기 때문에 (하위) 디렉토리 트리를 가리키는 모든 식별자가 커밋을 가리 키기 위해 사용될 수도 있습니다. 다시 말해, "커밋 방식"식별자 집합은 "트리 방식"식별자 집합의 엄격한 하위 집합입니다.

문서에 설명 된대로 ( 찾을 수 있도록 도와 준 Trebor에게 감사드립니다 ) :

<tree>

트리 개체 이름을 나타냅니다.

<commit>

커밋 개체 이름을 나타냅니다.

<tree-ish>

트리, 커밋 또는 태그 개체 이름을 나타냅니다. 소요 명령 <tree-ish> 인수는 궁극적으로 작동하도록하려는 <tree>목적되지만 자동으로 역 참조 <commit><tag>에서 그 점을 객체 <tree>.

<commit-ish>

커밋 또는 태그 개체 이름을 나타냅니다. <commit-ish> 인수를 사용 하는 명령은 궁극적으로 <commit>개체 에서 작동하려고 하지만를 가리키는 <tag>개체를 자동으로 역 참조 합니다 <commit>.

커밋 방식으로 사용할 수없는 트리 방식 식별자 집합은 다음과 같습니다.

  1. <rev>:<path>, 이는 커밋 객체가 아닌 디렉토리 트리 로 직접 연결 됩니다 . 예를 들면 HEAD:subdirectory.

  2. 디렉터리 트리 개체 의 Sha1 식별자 .


테이블에있는 항목 16은 어떻습니까? 그것이 나무 같은지 아닌지 확실하지 않다는 의미입니까? 0은 병합 상태를 나타내며이 개념은 인덱스에 디렉터리가 포함되어 있지 않기 때문에 Blob에만 적용됩니다. 참조 : stackoverflow.com/a/25806452/895245 . 따라서 질문은 다음과 같습니다. 모든 얼룩 모양도 나무 모양입니까? 내가 예라고 말할 수있는 한 : 사용하는 모든 매뉴얼 페이지는 <tree-ish>둘 다 허용하고 man gitrevisions정의합니다 trees ("directories of files")..
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

참고 git-archive그것이 소요라고 <tree-ish>하지만, 그것은을 허용하지 않습니다 <sha1>. 그래서 대신 <tree-ish-ish>. stackoverflow.com/a/12073669/680464
juanitogan 2014

그러나 내가 사용할 때 발생하는 일에 대해 궁금 <회전> : (어떤 경로? 그것은 시도로 작동하지 -하지만 문서에 관련 섹션을 찾을 수 없습니다.
마틴 Vejmelka

49

tree-ish는 다음 중 하나가 될 수있는 특정 트리의 이름을 지정하는 방법입니다.

  • 다음과 같은 참조 :
    • 머리
    • 태그
    • 지점 이름
    • 리모컨이있는 지점 이름 origin/somebranch
  • 해시시
  • 짧은 해시

그 위에, 상기의 어느 하나가 추가 될 수있다 ^, ~. 참조는 @{}몇 가지 추가 기능에 대한 표기법을 사용할 수도 있습니다 .

  • HEAD^또는 HEAD^1HEAD의 첫 번째 부모로 확인됩니다.
  • HEAD^2 두 번째 부모에게 해결됩니다.
  • HEAD^3더 드물고 문어 전략과합병의 산물 인 세 번째 부모 등으로 해결됩니다 .
  • HEAD~또는 HEAD~1머리의 첫 번째 부모로 해결됩니다.
  • HEAD~2HEAD의 첫 번째 부모의 첫 번째 부모로 확인됩니다. 이것은 다음과 같습니다.HEAD^^
  • HEAD@{0} 현재 HEAD로 해결됩니다.
  • HEAD@{1}이전 헤드로 해결됩니다. 참조 로그를 사용하므로 참조에서만 사용할 수 있습니다. 의 경우에는 HEAD모든 커밋, 병합, 체크 아웃 HEAD의 값을 변경하며, 따라서 로그에 추가한다. git reflog HEADHEAD의 모든 움직임을 볼 수있는 참조 로그를 표시하고 제대로 @{1}해결되는 항목 등을 표시합니다.

그것은 예를 들어, 저장소에 의미가로 위의 대부분은 더 긴으로 결합 될 수있다 : HEAD@{2}~3, somebranch^2~4, c00e66e~4^2, anotherbranch~^~^~^.

따라서 위에서 설명한 모든 조합과 그 조합은 문서에서 tree-ish로 의미하는 것입니다. 이는 대부분의 git 명령에 사용해야하는 트리 (또는 개정판)가 무엇인지 말하는 방법입니다.

Git 책의 개정 선택에 대한 자세한 정보 .


1
이 답변은 일반적으로 개정 (커밋)을 설명하고 중요한 경우를 놓쳤습니다. master:path/to/directory, 이는 트리 모양이지만 커밋은 아닙니다. Cupcake 's는이를 더 명확하게합니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

11

당신은 아마 원합니다

git archive master foo | tar -x -C ~/destination

이 표현 master/foo은 의미가 없습니다. master은 분기 이름이고 foo제가 생각하기에 디렉토리 이름입니다.

편집 : (깨진 링크를 제거했습니다. 주석을보십시오.)


"나무"라는 단어는 "Git Treeishes"링크에서 더 이상 찾을 수 없습니다. FYI
Robert

Treeish는 일반적으로 디렉토리 레이아웃이 아닌 개정 트리를 나타냅니다.
Jürgen Strobel

6
@ JürgenStrobel : 사실이 아닙니다. 이 용어는 문서의 현재 버전에서 더 이상 사용되지 않기 때문에 과거 시제로 두 가지를 모두 언급하지 않았습니다. (이것이 링크가 끊어진 이유이기도합니다.) 이전에 treeish 는 git의 객체 저장소에있는 트리 객체로 해석 될 수있는 것을 언급했습니다. 이것은 각 커밋이 단일 트리 객체를 참조하기 때문에 커밋 사양을 포함합니다. 트리 개체에는이 커밋의 디렉터리 트리에 대한 정보가 포함되어 있습니다. 자세한 내용은 "Pro Git"의 git 개체에 대한 섹션을 참조 하십시오.
Sven Marnach

6

의 정의 <tree-ish><commit-ish>투시 자식 (1) man 페이지를. 용어를 검색해야합니다. 일반적으로 <tree-ish>git 트리 객체에 대한 참조를 의미하지만 트리를 참조하는 객체 유형 (예 : 커밋 또는 분기)을 전달하면 git은 자동으로 참조 된 트리를 사용합니다.


그리고 gitrevisions(7).
Xiong Chiamiov 2013 년

0

나는 소스 제어와 자식에 대한 초보자입니다. 이것이 내가 아는 것입니다. 트리는 저장소에있는 파일의 구조입니다. 파일 시스템의 디렉토리와 유사합니다. 참조- 이 트리보기를 생성 한 git 도구는 무엇입니까?

Tree-ish는 나무와 같은 의미입니다. 트리의 일부 또는 커밋을 참조합니다. 커밋의 SHA-1 해시의 전체 또는 일부, HEAD 포인터, 분기 참조, 태그 참조 중 하나를 사용하여 커밋을 참조 할 수 있습니다. 또 다른 방법은 커밋의 조상 또는 부모와 함께 언급 된 방법 중 하나를 사용합니다. 조상 예 : 여기에 이미지 설명 입력


0

에서 힘내 용어 트리 틱 "A 트리 객체 또는 재귀 트리 객체에 역 참조 할 수있는 개체가"입니다. 커밋, HEAD 및 태그는 나무 모양의 개체의 예입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.