깊이 1로 특정 커밋을 얕은 복제하는 방법은 무엇입니까?


83

저장소의 특정 커밋을 얕게 복제하는 것이 가능합니까? 같은 것

git clone http://myrepo.git 728a4d --depth 1

SHA로 커밋 할 때 저장소 상태를 얻으려면 728a4d...?

동기는 전체 저장소를 복제하지 않고 특정 커밋에서 저장소의 상태에만 관심이있을 때 특정 커밋을 확인하는 것입니다.


답변:


81

Git 2.5.0 ( 클라이언트 및 서버 측 모두 에서 사용 가능해야 함)부터 uploadpack.allowReachableSHA1InWant=true특정 SHA1 가져 오기를 활성화하도록 서버 측에서 설정할 수 있습니다 .

git init
git remote add origin <url>
git fetch --depth 1 origin <sha1>
git checkout FETCH_HEAD

이 작업을 git clone직접 수행 할 구문을 찾지 못했습니다 .


3
적어도 github에서는 작동하지 않습니다. github.com/Seldaek/monolog/commit/…에 대한 가져 오기를 할 수 없습니다 . git fetch --depth 1 origin d6be96bc...fatal: Couldn't find remote ref d6be96bc...
Kirby

9
정답은 GitHub의에만 사용할 수있다 allowTipSHA1InWant하지만,도, allowReachableSHA1InWantallowAnySHA1InWant.
sschuberth

내가 말하는 오류가 발생했습니다error: pathspec 'FETCH_HEAD' did not match any file(s) known to git
rocketspacer

2
이것을 가지고 놀다가 매우 현대적인 버전의 git 클라이언트에서만 작동한다는 것을 알았습니다. git 2.17조차도 나를 위해 작동하지 않았습니다. 2.24에서 git을 다시 빌드했으며 작동했습니다.
Eyal

1
에 2.27.0.windows.1와 나를 위해 일한 github.com/dotnet/aspnetcore @ 62c098bc170f50feca15916e81cb7f321ffc52ff
JJS

25

참고 : 내 예제는 커밋 해시로 복제하는 데 도움이되지 않지만 태그를 복제하고 경량 리포지토리를 갖는 데 도움이됩니다.

"클론"에 하나의 커밋 만 있어야하고 커밋 해시를 사용하려는 경우 짧은 대답은 NO 입니다.

이 명령 구성 ( v2.13.2.windows.1에서 테스트 )을 태그에 사용합니다.

git clone --depth 1 git@github.com:VENDOR/REPO.git --branch 1.23.0 --single-branch

전체 예 :

$ git clone --depth 1 git@github.com:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

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>

$ cd monolog

.git디렉토리 크기 ( 267K2.6M 전체 사용하여 clone) :

$ du -h --max-depth=0 .git
267K    .git

표시하고 싶은 --branch것은 태그 / 분기를 취할 수 있습니다.

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

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

UPD

간단히 말해서 "refs"를 취할 수 있습니다. 자세한 내용은 여기에서 읽을 수 있습니다. "서버가 보급되지 않은 개체에 대한 요청을 허용하지 않습니다."라는 git 오류 메시지는 무엇을 의미합니까?

또한 다음과 같은 트릭 이 없습니다 .

git fetch --depth 1 origin <COMMIT_HASH>

내 실수를 지적 해 주신 @BenjiWiebe에게 감사드립니다.


2
이것에 대한 백만 찬성. 너무 많은 사람들이 이것이 불가능하다고 주장합니다.
jooks

3
--branch커밋을 지원 하지 않고 브랜치 이름 만 지원합니다. 이것은 전혀 해결되지 않습니다. 사실이 아니기 때문에.
abourget

1
커비 지금은이 작업을 수행하기 위해 노력하고있어, 그것은 일을하지 않습니다 에 대한 커밋 @abourget 말한대로. 아마도 태그와 브랜치에서 작동하지만 커밋 해시로 시도하고 있는데 작동하지 않습니다.
BenjiWiebe

@ BenjiWiebe, 나는 당신의 요점을 얻었습니다. 예, GIT가 특정 커밋을 결정할 수없는 것 같습니다. :-/ 더 깊이 파헤칠 게요.
Kirby

@BenjiWiebe, 불행히도 커밋 해시를 사용할 방법이 없습니다. 두 번 확인했습니다.
Kirby

6

즉각적인 대답은 : 당신은 할 수 없습니다.
왜? 자세한 설명은 여기에서 찾을 수 있습니다. Git 클론 특정 커밋 옵션이없는 이유는 무엇입니까?

너는 어떤 다른 일을 할 수 있니?

특정 커밋에 저장소를 복제하는 방법은 무엇입니까? (전체 클론)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

더 많은 정보:

단일 분기를 복제하는 방법은 무엇입니까?

git clone <url> --branch <branch_name> --single-branch <folder_name>

주어진 브랜치에서 최신 커밋 만 복제하는 방법은 무엇입니까?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

깊이 1로 특정 커밋을 얕은 복제하는 방법은 무엇입니까?

@sschuberth가 주석으로 언급했듯이 : --depth암시합니다 --single-branch.

복제 대신 fetch 명령을 사용하십시오.

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch origin <sha1>

5
이것은 질문에 대한 답이 아닙니다. 질문자는 직접 가리키는 참조가없는 경우에도 단일 커밋을 체크 아웃하는 방법을 알고 싶어합니다.
Joseph K. Strauss

미안합니다. 놓쳤습니다. 어떻게 든 그가 최신 커밋이 필요하다는 것을 이해했습니다. 답변 업데이트. 주셔서 감사합니다
CodeWizard

--depth을 의미하므로이 --single-branch경우 삭제할 수 있습니다.
sschuberth

git fetch실제로 SHA1을 수락 합니까 refspec?
Phil Frost

아니. 그 단순히 브랜치의 이름과 일치하는 데이터 "다운로드"
CodeWizard

5

whilebash에서 사용해보십시오 .

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

이것은 각 커밋을 개별적으로 가져 오기 때문에 매우 느립니다. 증분을 늘릴 수 있지만 (일괄 적으로 커밋을 가져오고 네트워크를 통해 성능을 향상시키기 위해) 여전히 무차별 대입 방식입니다.


왜 반대표는? ... 실제로이 작업이 필요했고 내 솔루션이 완료되었습니다!
코린

몇 년 전에 만든 커밋을 원하거나 더 이상 존재하지 않는 경우 어떻게해야합니까?
Daan Bakker

@DaanBakker, 커밋이 더 이상 존재하지 않는 경우이를 확인하는 유일한 방법은 전체 원격 저장소를 가져 오는 것이며, 거기에 존재하지 않고 다른 복제본이 없으면 불행히도 막 다른 골목에 있습니다.
Corin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.