Git으로 특정 태그 다운로드


1941

Git 저장소의 특정 태그를 다운로드하는 방법을 알아 내려고 노력 중입니다. 현재 버전보다 한 버전입니다.

git 웹 페이지에 이전 버전에 대한 태그가 있고 16 진수 숫자의 객체 이름이 있음을 알았습니다.

그러나 버전 이름은 Tagged release 1.1.5사이트에 따라 " "입니다.

다음과 같은 명령을 시도했습니다 (이름이 변경됨).

git clone http://git.abc.net/git/abc.git my_abc

그리고 디렉토리, 하위 디렉토리 등을 얻었습니다.

전체 저장소 인 경우 원하는 버전을 얻으려면 어떻게해야합니까? 그렇지 않은 경우 특정 버전을 어떻게 다운로드합니까?


11
프로덕션과 완전히 다른 리포지토리에서 개발하므로 git checkout을 사용하려고 할 때 프로덕션에서 태그를 알지 못했습니다. 해결책은 "git pull --tags"를 사용하고 git checkout을 사용하는 것입니다.
엔터프라이즈 아키텍트

11
너무 일 "--tags를 가져 힘내"
존 Erck에게

16
전체 리포지토리를 복제 한 다음 태그로 전환하지 않으려면 직접을 수행하면 clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc됩니다. 이것은 코스 이름이 같은 브랜치가없는 경우에만 작동합니다 (방법론에 따라 이런 일이 발생하지 않을 수 있음).
RedGlyph

3
@ RedGlyph 감사합니다. 그렇지 않으면 우리는 이렇게 할 수 있습니다. git checkout -b new-branch tag-name. 이제 새 브랜치를 복제하십시오. 우리가 원할 때마다 새 브랜치를 삭제할 수 있습니다.
kalidasan

답변:


2871
$ git clone

전체 저장소를 제공합니다.

복제 후 태그를 나열한 $ git tag -l다음 특정 태그를 체크 아웃 할 수 있습니다 .

$ git checkout tags/<tag_name>

더 좋은 방법은 체크 아웃하고 브랜치를 생성하십시오 (그렇지 않으면 수정 번호 태그의 이름을 딴 브랜치에 있음).

$ git checkout tags/<tag_name> -b <branch_name>

15
네. git은 이런 점에서 Subversion과 다릅니다. svn 태그는 기본적으로 파일을 새 폴더에 복사하므로 특정 파일 묶음을 svn 체크 아웃 할 수 있지만 git 태그는 단순히 특정 개정을 가리키는 포인터입니다.
dbr

5
같은 이름의 브랜치와 태그가 있으면 어떻게합니까? "git checkout <name>"이라고 말하면 "경고 : refname '<name>'은 (는) 모호합니다. '<name>'분기로 전환되었습니다."-태그 대신 전환하도록 어떻게 지시합니까?
MatrixFrog

54
체크 아웃 할 때 데릭이 언급했듯이 리포지토리는 "분리 된 헤드"상태가됩니다. 대신 -bgit에게 새 브랜치를 생성하고 브랜치 이름을 지정하는 플래그를 추가하십시오 .git checkout <tag_name> -b <branch_name>
hellatan

22
@hellatan 당신은 실제로 브랜치를 만들고 싶을 때만 그렇게해야하지만 대부분의 경우에는 그렇지 않습니다. "분리 된 헤드"상태로 실행해도 문제가되지 않으며, 단지 git history를 확인하고 싶을 때 원하는 것입니다.
machineghost

4
git 버전 1.8.3.5이상에서는 --branch <tag ref>리포지토리 <tag ref>HEAD로 시작하는 리포지토리를 다운로드 할 수 있어야합니다 . 와 결합 --depth 1하면 얕은 태그 체크 아웃이 수행됩니다. 참조 stackoverflow.com/a/21699307/1695680
ThorSummoner

409
git clone --branch my_abc http://git.abc.net/git/abc.git

저장소를 복제하고 관심있는 태그에 남겨 둡니다.

git clone 상태 1.8.0에 대한 설명서 .

--branch는 결과 저장소의 해당 커밋에서 태그를 가져와 HEAD를 분리 할 수도 있습니다.


7
분리 된 HEAD 상태가 되더라도 태그에 대해 (적어도 현재) 작동합니다.
mxcl 2016 년

72
참고 : 또한 --depth 1현재 커밋이 아닌 커밋을 다운로드하지 않도록 지정하십시오 .
Acumenus

4
실제로 태그 에서는 작동 하지 않습니다 . 가지만. 편집 : 최신 버전의 git 만 지원하는 것처럼 보입니다.
lzap

또한 .git / config를 편집하여 두 개 이상의 태그를 얕게 복제 할 수 있습니다 (필요한 경우 얕은 복제본을 전체 복제본으로 업그레이드 등).
Sam Watkins

태그와 함께 원하는 분기를 지정할 수도 있습니다. 마찬가지로 git clone --branch my_abc http://git.abc.net/git/abc.git -b quality품질 우리가 BTW 원하는 지점의 이름입니다.
hazimdikenli

180

배포를 위해 주어진 태그 만 체크 아웃하기 위해 다음과 같이 사용합니다.

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

이것은 완전한 저장소가 아닌 최신 코드에만 관심이있는 경우 원격 저장소에서 코드를 체크 아웃하는 가장 빠른 방법 인 것 같습니다. 이런 식으로 'svn co'명령과 비슷합니다.

참고 : Git 매뉴얼 에 따라 --depth플래그를 전달하면 --single-branch기본적으로 암시 됩니다.

--깊이

지정된 커밋 수만큼 잘라낸 기록을 사용하여 단순 복제본을 만듭니다. --no-single-branch가 모든 브랜치의 팁 근처에서 히스토리를 가져 오기 위해 제공되지 않는 한 --single-branch를 의미합니다. 하위 모듈을 얕게 복제하려면 --shallow-submodules도 전달하십시오.


10
이 복잡한 것을 믿을 수 없습니다. 아무도 자신의 코드가 다른 사람에 의해 사용될 것으로 기대하지 않습니다.
Ben

9
@Ben, 이것은 실제로 가장 간단한 솔루션입니다 (하나의 명령이 필요합니다)
Eliran Malka

3
@ 벤 왜 이것이 복잡한가? 기본 기능과 다르게 수행하려는 몇 가지 기능이있는 특수 사용 사례입니다. 물론 지정해야합니다. 일반적인 해결책은 분산 된 vc 에서 전체 저장소를 체크 아웃하는 것 입니다.
erikbwork

9
@ 벤이 맞아. git은 복잡하고, 몇 년 전에 Linus에 의해 쓰여졌으며, 그것이 어떻게 작동하는지 "진실하게"이해하는 유일한 사람입니다. xkcd.com/1597
RyanNerd

11
--depth n의미합니다 --single-branch. 둘 다 필요하지 않습니다.
Niyaz

98

나는 git 전문가는 아니지만 이것이 효과가 있다고 생각합니다.

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

또는

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

두 번째 변형은 태그를 기반으로 새 분기를 설정하므로 '분리 된 HEAD'를 피할 수 있습니다. (git-checkout 매뉴얼)

모든 git repo에는 전체 개정 내역이 포함되어 있으므로 repo를 복제하면 최신 커밋과 원하는 태그를 포함하여 이전에 있었던 모든 것에 액세스 할 수 있습니다.


4
고마워. 내가 사용하는 데 필요한 git checkout -b b1.5.0 v1.5.0성공적으로 Github에서 페이지에 전달할 수있는 'GH-페이지'지점에서 버전을 체크 아웃시. 내가 쓴이 요지 (Gist)는 다른 사람들이 분기 / 태그 / 서브 모듈을 다시 도울 수 있도록 도와 준다. gist.github.com/1064750
Chris Jacob

4
난 당신이 해 이후 (터미널에 붙여 넣기 등의 경우)이 정확하다고 생각하지 않습니다 cdabc/당신이 지점 체크 아웃하기 전에 첫째
스티븐 루

@StevenLu 물론 정확합니다. 잘라 붙여 넣기보다는 개념을 사용하려고했지만 가능한 한 정확할 수도 있습니다. 을 추가했습니다 cd.
grossvogel

81

git archive를 사용하여 주어진 태그 또는 커밋 ID에 대한 타르 볼을 다운로드 할 수 있습니다 :

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

태그의 zip 아카이브를 내보낼 수도 있습니다.

  1. 리스트 태그 :

    git tag
    
    0.0.1
    0.1.0
    
  2. 태그 내보내기 :

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. 노트:

    • 형식을 지정할 필요가 없습니다. 출력 파일 이름으로 선택됩니다.
    • 접두사를 지정하면 코드가 디렉토리로 내보내집니다 (후행 슬래시가 포함 된 경우).

3
이 명령은 하위 모듈에서 작동하지 않습니다. stackoverflow.com/questions/1591387/…
Zitrax

3
그러나 git archive는 버전 제어도 제거하므로 다른 git checkout을 수행하여 다음 태그로 업그레이드 할 수는 없습니다.
idbrii

9
그렇습니다. 버전 제어는 잃지 만 git clone과 비교하여 git archive 저장 시간은 절대적으로 신뢰할 수 없습니다! +1
MarcH

이것은 내가 원하는 git archive모든 것이 공개 저장소에서 다운로드 할 때 암호를 요구 한다는 점을 제외하고 는 내가 원하는 것에 너무 가깝습니다. ssh 대신 http를 사용하려면 어떻게해야합니까?
robru

1
fatal: Operation not supported by protocol.Unexpected end of command stream오류로 실패 합니다. 또는 fatal: The remote end hung up unexpectedly오류를 반환 할 수도 있습니다 .
Acumenus

52

--single-branch스위치를 사용하십시오 (Git 1.7.10부터 사용 가능) . 구문은 다음과 같습니다.

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

예를 들면 다음과 같습니다.

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

이점 : Git은 정확히 동일한 양의 파일을 체크 아웃하는 동안 지정된 브랜치 / 태그에 대해서만 객체를 수신하고 델타를 해결해야합니다! 소스 리포지토리에 따라 많은 디스크 공간이 절약됩니다. (더욱 빠를 것입니다.)


3
이 답변을 다운 보트 / 다운 보트 한 사람 : 다운 보트에 대한 간단한 설명과 함께 의견을 남겨주십시오. (조금 혼란 스럽기 때문에 그냥 물어보십시오. afaik, 이것은 주어진 문제에 가장 적합한 솔루션입니다. 그렇게 생각하지 않으면 이유를 알고 싶습니다.) 많은 감사합니다.
eyecatchUp

5
.. SOF에 생명이 있다고 .. 당신의 대답은 그들의 downvotes 가능성이 입증되어, 매우 좋은 있습니다 .. downvotes 너무 많이 이해하려고하지 마십시오
javadba

git 버전 2.22.0.windows.1에서 작동하지 않았습니다
Mahesh

29

먼저 해당 리모콘의 모든 태그를 가져옵니다.

git fetch <remote> 'refs/tags/*:refs/tags/*'

아니면 그냥 입력

git fetch <remote>

그런 다음 사용 가능한 태그를 확인하십시오.

git tag -l

아래 명령을 사용하여 특정 태그로 전환하십시오.

git checkout tags/<tag_name>

희망이 당신을 도울 것입니다!


왜 'git tag -l'을 사용합니까? 'git tag'와 동일해야합니까?
serup

1
@serup; git tag태그를 추가하면서 태그를 추가 git tag -l합니다
Joost Döbken

18

linux sort명령을 사용 하여 태그를 정렬 할 수 있으면 다음을 사용하십시오.

git tag | sort -n | tail -1

예. git tag반환되는 경우 :

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 출력합니다 :

v1.0.5

git tag | sort -n | tail -2 | head -1 출력합니다 :

v1.0.4

(두 번째로 최근 태그를 요청했기 때문에)

태그를 체크 아웃하려면 먼저 저장소를 복제 한 후 다음을 입력하십시오.

git checkout v1.0.4

.. 또는 필요한 태그.


25
당신이 v1.0.10에 도달 할 때까지 그리고 나쁜 일이 발생합니다 :)
Laurent Grégoire

10
태그를 시간순으로 정렬하려면git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

하나의 라이너로 최신 버전 자동 체크 아웃git checkout `git tag | sort -n | tail -1`
weiji14

sort -V대신에 사용하고 싶을 수도 있습니다 sort -n. 전자는 반드시 숫자가 아닌 버전 (예 : "1.2.3")을 올바르게 처리합니다. 또한 "0.4.10"은 "0.4.2"다음이 아니라 "0.4.1"뒤에옵니다 -n.
Mateusz Misiorny

16

git checkout documentation을 확인한 결과 흥미로운 점이 하나 있습니다.

git checkout -b <new_branch_name> <start_point> 여기서 <start_point>는 새 분기를 시작할 커밋의 이름입니다. 기본적으로 HEAD

따라서 다음과 같이 태그 이름을 언급 할 수 있습니다 (tag는 커밋 이름 일뿐입니다).

>> git checkout -b 1.0.2_branch 1.0.2
이후, 일부 파일 수정
>> git push --tags

추신 : Git에서는 태그를 커밋에 대한 레이블이므로 태그를 직접 업데이트 할 수 없으므로 분기와 동일한 태그를 체크 아웃 한 다음 커밋 한 다음 별도의 태그를 만들어야합니다.


1
또는 변경을 기대하지 않고 해당 태그에서 코드가 어떻게 보이는지 확인하려면 분기를 만들지 않고 태그를 체크 아웃하면됩니다. "분리 된 헤드"상태임을 설명하는 텍스트가 표시되며 나중에 원하는 경우 언제든지 분기를 만들 수 있습니다.
MatrixFrog

16
git fetch <gitserver> <remotetag>:<localtag>

====================================

방금 했어요 먼저 태그 이름 철자를 알고있었습니다.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

이것은 나에게 git 서버에서 선택할 수있는 태그 목록을 제공했다. 원래 포스터는 이미 자신의 태그 이름을 알고 있으므로이 단계가 모든 사람에게 필요한 것은 아닙니다. 실제 목록은 더 길지만 출력은 다음과 같습니다.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

원하는 태그를 선택하고 다음과 같이 아무것도 가져 오지 않았습니다.

git fetch gitserver Fix_110

그런 다음 로컬 컴퓨터에서 태그를 지정하여 태그에 동일한 이름을 지정했습니다.

git tag Fix_110 FETCH_HEAD

다른 사람들이 제안한 것처럼 원격 저장소를 복제하고 싶지 않았습니다. 현재 작업중 인 프로젝트가 크고 깔끔한 환경에서 개발하고 싶습니다. 나는 이것이 전체 저장소 복제를 제안하는 솔루션보다 "특정 태그를 다운로드하는 방법을 알아 내려고 노력 중"이라는 원래의 질문에 더 가깝다고 생각합니다. DOS 0.1 소스 코드를보고 싶은 사람이 왜 Windows NT 및 Windows 8.1 소스 코드의 사본을 가져야하는지 모르겠습니다.

또한 다른 사람들이 제안한대로 CHECKOUT을 사용하고 싶지 않았습니다. 지점을 체크 아웃했으며 그 영향을 원하지 않았습니다. 저의 의도는 내가 원하는 것을 골라 내 개발에 추가 할 수 있도록 원하는 소프트웨어를 가져 오는 것이 었습니다.

태그가 지정된 커밋의 복사본이 아닌 태그 자체를 가져 오는 방법이있을 수 있습니다. 가져온 커밋에 직접 태그를 달아야했습니다. 편집 : 아 네, 지금 찾았습니다.

git fetch gitserver Fix_110:Fix_110

콜론이 보이는 곳은 remote-name : local-name이며 여기에 태그 이름이 있습니다. 이것은 작업 트리 등을 화나게하지 않고 실행됩니다. 원격에서 로컬 시스템으로 물건을 복사하여 자신의 사본을 가지고있는 것 같습니다.

git fetch gitserver --dry-run Fix_110:Fix_110

--dry-run 옵션을 추가하면 원하는 것을 확인하려는 경우 명령이 수행하는 작업을 볼 수 있습니다. 그래서 간단한 것 같아

git fetch gitserver remotetag:localtag

실제 답변입니다.

=

태그에 대한 별도의 메모 ... 새로운 것을 시작할 때 일반적으로 git init 후에 빈 저장소에 태그를 지정합니다.

git rebase -i XXXXX 

커밋이 필요하고 "첫 번째 소프트웨어 변경을 포함한 변경 사항을 어떻게 리베이스합니까?"라는 의문이 생깁니다. 그래서 일을 시작하면

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

즉, 첫 번째 실제 변경 전에 커밋을 만든 다음 나중에 사용합니다.

git rebase -i EMPTY 

내 모든 작업, 리베이스하려면 첫 번째 변화를 포함하여 .


8

Peter Johnson의 답변을 바탕으로 나 자신을위한 멋진 별명을 만들었습니다.

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

일명 'git checkout latest tag'.

이것은 lOranger가 지적한 것과 같은 상황을 적절히 처리하는 GNU 버전의 정렬에 의존합니다.

v1.0.1
...
v1.0.9
v1.0.10

Mac을 사용하는 경우 brew install coreutilsgsort를 대신 호출하십시오.



5

태그 확인

태그가 가리키는 파일의 버전을 보려면 git checkout을 수행 할 수 있지만 저장소가“분리 된 HEAD”상태가되어 부작용이 발생합니다.

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

"분리 된 HEAD"상태에서 변경 후 커밋을 생성하면 태그는 동일하게 유지되지만 새 커밋은 분기에 속하지 않으며 정확한 커밋 해시를 제외하고는 도달 할 수 없습니다. 따라서 예를 들어 이전 버전의 버그를 수정하는 등 변경해야 할 경우 일반적으로 분기를 작성하려고합니다.

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

이 작업을 수행하고 커밋을 수행하면 버전 2 브랜치는 v2.0.0 태그와 약간 다를 수 있습니다. v2.0.0 태그는 새로운 변경 사항으로 진행되므로주의해야합니다.


4

나는 이것을 github API를 통해한다 :

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
이것은 브랜치와 태그에 적용되지만 태그를 생성해야하는 마스터 헤드에는 적용되지 않습니다. 최소 크기의 버전을 얻는 매우 우아한 방법입니다.
J0hnG4lt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.