원격 Git 저장소에서 특정 커밋 검색
내 PC에서 복제하지 않고 원격 Gitrepo에서 특정 커밋 하나만 검색할 수 있는 방법이 있습니까?원격 레포의 구조는 저와 완전히 같아서 충돌은 없을 것입니다. 하지만 어떻게 해야 할지 몰라서 그 거대한 저장소를 복제하고 싶지 않습니다.
저는 git가 처음인데, 방법이 없을까요?
Git 버전 2.5+(2015년 2분기)부터는 전체 레포를 복제하지 않고 단일 커밋을 가져올 수 있습니다.
2015년 5월 21일 프레드릭 moroten
메들리()의 커밋 68ee628을 참조하십시오.
(Junio C Hamano에 의해 합병됨 -- -- 2015년 6월 1일 커밋 a9d3493)
이제 새 구성(서버 측)이 있습니다.
uploadpack.allowReachableSHA1InWant
허락하다
upload-pack
참조 팁에서 도달할 수 있는 개체를 요청하는 가져오기 요청을 수락합니다.그러나 객체 도달 가능성을 계산하는 데는 계산 비용이 많이 든다는 점에 유의하십시오.
은 " " "입니다.false
.
서버 측 구성을 얕은 복제본()git fetch --depth=1
과 결합하면 단일 커밋을 요청할 수 있습니다( 참조).
git fetch --depth=1 ../testrepo/.git <full-length SHA1>
당신은 할 수 .git cat-file
커밋이 페치되었는지 확인하는 명령:
git cat-file commit <full-length SHA1>
"
git upload-pack
그것은 도움이 됩니다.git fetch
할 수 한 수 .uploadpack.allowReachableSHA1InWant
구성 변수입니다.
매트가 논평에서 언급한 바와 같이:
SHA는 생략되지 않은 완전한 SHA여야 합니다. 그렇지 않으면 Git는 커밋을 찾을 수 없다고 주장할 것입니다.
전체 설명서는 다음과 같습니다.
upload-pack
으로 도달 가능한 sha1를 허용합니다. sha1 가져오기
와 함께
uploadpack.allowReachableSHA1InWant
측에 " 버측에 구옵션성된서, "git fetch
는 보급되지 않은 개체의 이름을 지정하는 "접두사" 행을 사용하여 요청할 수 있습니다(대역 외 또는 하위 모듈 포인터에서 가져온 것으로 간주됨).
지점 팁에서 도달할 수 있는 개체만, 즉, 광고된 지점과 지점의 결합이 숨겨집니다.transfer.hideRefs
처리됩니다.
도달 가능성을 확인하기 위해 기록을 뒤로 걸어야 하는 관련 비용이 발생합니다.이 기능은 특히 얕은 페치가 사용되는 경우 전체 리포지토리를 복제할 필요 없이 sha1이 알려진 특정 커밋의 내용을 가져올 때 사용할 수 있습니다.
유용한 사례는 다음과 같습니다.
- 기록에 있는 대용량 파일이 들어 있는 저장소,
- 하위 모듈 체크아웃에 필요한 데이터만 가져오는 중입니다.
- sha1이 정확히 어느 지점에 속하는지 말하지 않고 공유할 때와 Gerrit에서 변경 번호 대신 커밋 측면에서 생각한다면.
(게릿 사건은 이미 다음을 통해 해결되었습니다.)allowTipSHA1InWant
모든 게릿 변화에는 기준이 있기 때문입니다.)
Git 2.6(2015년 3분기)은 이 모델을 개선할 것입니다.
commit 2bc31d1, commit cc118a6(2015년 7월 28일) by Jeff peff
King() 참조.
(주니오 C 하마노에 의해 합병되었습니다 -- -- 2015년 8월 19일 커밋 824a0be에서)
refs
부정적인 지지transfer.hideRefs
을 ,
transfer.hideRefs
구성, 나중에 해당 구성을 "숨김 해제"하도록 재정의할 방법이 없습니다.
이 패치는 "부정적" 숨기기를 구현하여 다른 일치 항목이 숨기더라도 일치 항목이 즉시 숨김 해제로 표시되도록 합니다.
일반적인 " 우선 (및 " 1승"의 항목)가 작동할 수 하는 항목을 ..git/config
를 들어,는 예들어를, 을(으)로 합니다./etc/gitconfig
).이제 다음을 수행할 수 있습니다.
git config --system transfer.hideRefs refs/secret git config transfer.hideRefs '!refs/secret/not-so-secret'
기다를
refs/secret
하나의 특정 레포에서 하나의 공개 비트를 제외한 모든 레포에서.
Git 2.7(2015년 11월/12월)은 다시 개선될 것입니다.
커밋 948bfa2, 커밋 00b293e(2015년 11월 5일), 커밋 78a766a, 커밋 92cab49, 커밋 92cab49(2015년 11월 3일), 커밋 00b293e, 커밋 92cab49, 커밋 92cab49,lfos
커밋 92cab49(2015년 11월 3일)를 참조하십시오.
도움을 받은 사람: 에릭 sunshineco
선샤인().
(Jeff King에 의해 합병됨 -- -- 2015년 11월 20일 커밋 dba85e에서)
config.txt
.hideRefs
현재로서는, 어떻게 해야 할지에 대한 명확한 정의가 없습니다.
transfer.hideRefs
네임스페이스가 설정될 때 동작해야 합니다.
을 설명해 보세요.hideRefs
이 경우 접두사가 제거된 이름과 일치합니다.이 이런식로의 방법입니다.hideRefs
패턴은 현재 수신 팩에서 처리됩니다.
참조 숨기기: 전체 참조 일치에 대한 지원
는 리프된 참조를 시키는 것 에도 일하는제참외이도수있다추습니할가제치에거조된▁now▁in다를 추가할 수 있습니다.
hideRefs
전체(삭제되지 않은) 참조가 일치하는 패턴입니다.
풀 하기 위해서, 그은 반드시를 붙여야 .^
).
transfer.hideRefs:
네임스페이스를 사용 중인 경우 네임스페이스 접두사가 각 참조에서 제거된 후 다음과 일치합니다.
transfer.hiderefs
패턴.
를 들어, 만약에 들어만, 약를.refs/heads/master
에 명시되어 있습니다.transfer.hideRefs
는 그고현네이스는입니다.foo
,그리고나서refs/namespaces/foo/refs/heads/master
되어 있지만, 광서누지만었락되에고,만광▁is지ments▁but누.refs/heads/master
그리고.refs/namespaces/bar/refs/heads/master
여전히 소위 "가진" 라인으로 광고됩니다.
스트리핑 전에 참조를 일치시키려면 다음을 추가합니다.^
심판명 앞에결합할 경우!
그리고.^
,!
먼저 지정해야 합니다.
R.. 의견에 구성이 언급되어 있습니다. 이를 통해upload-pack
를받아임들을 fetch
모든 개체를 요청하는 요청(기본값:false
).
David "novalis" Turner()novalis
의 commit f8edea(2016년 11월, Git v2.11.1) 참조:
upload-pack
으로 임의의 sha1
사용자가 리포지토리의 모든 항목에 완전히 액세스할 수 있다고 신뢰하는 경우 도달 가능성 검사를 수행하는 것은 약간 어리석은 것 같습니다.
또한, 분산 시스템에서는 매우 활발합니다. 한 서버는 ref를 광고하지만 다른 서버는 ref에 강제 푸시를 수행하고 있으며, 두 개의 HTTP 요청은 결국 이러한 서로 다른 서버로 전송됩니다.
Git 2.34 (2021년 4분기)를 사용하여,git upload-pack
(man) 의 반대편에서 실행되는 " "는 want-ref 요청을 처리할 때 ref 이름 공간을 고려하는 것을 잊었습니다.
commit 53a66ec, commit 3955140, commit bac01c6 (2021년 8월 13일) by Kim Altintop kim
() 참조.
(주니오 C 하마노에 의해 합병 -- -- 커밋 1ab13eb, 2021년 9월 10일)
전달의 상호 작용을 명확히
docs
합니다.참조 및 네임스페이스 숨기기사인 오프 바이: Kim Altintop
리뷰 담당자: 조나단 탄
네서이대펼칩다의 에 대한 합니다.
transfer.hideRefs
사이의 미묘한 차이를 지적하기 위해upload-pack
그리고.receive-pack
.3955140 (":
upload-pack.c
네임스페이스와 관련된 want-ref 처리", 2021-07-30, Git v2.34.0 -- 배치 #5에 나열된 병합) 교육.upload-pack
를want-ref
숨겨진 참조에 대한 s. 이제 언급되었습니다.
숨겨진 참조의 이름이 드러나지 않지만, 그것이 가리키는 객체 ID는 분명합니다.
git config
이제 관리 페이지에 다음 항목이 포함됩니다.
참조의전과 일치하기
transfer.hiderefs
패턴.스트리핑 전에 참조를 일치시키려면 다음을 추가합니다.^
심판명 앞에결합할 경우!
그리고.^
,!
먼저 지정해야 합니다.
git config
이제 관리 페이지에 다음 항목이 포함됩니다.
광고에서 누락되었습니다.한다면
uploadpack.allowRefInWant
설됨정,upload-pack
치료할 것입니다want-ref refs/heads/master
프에v2서에서fetch
하듯이 명령합니다.refs/namespaces/foo/refs/heads/master
존재하지 않았습니다.receive-pack
는 면에반이, 는히그를언않지급심하가고판, 전을이리이것다객키는니체입")..hav
e" 라인).
Git 2.39 (Q4 2022)에서 git receive-pack
(man)"는 전송된 데이터의 연결을 확인하기 위한 경계로 모든 로컬 참조를 사용했지만, 지금은 푸셔에 광고한 참조만 사용합니다.
가 있는 .hideRefs
이렇게 하면 검사를 수행하는 데 필요한 리소스가 줄어듭니다.
커밋 BCE678, 커밋 5ff36c9, 커밋 8c1bc2a, 커밋 1e9f273, 커밋 05b9425, 커밋 9b67eb6, 커밋 5eeb9aa(2022년 11월 17일)를 참조하십시오.pks-t
(주니오 C 하마노에 의해 합병 -- -- 2022년 11월 23일 커밋 f8828f9에서)
revision
숨겨진 참조를 제외하는 새 매개 변수 추가패트릭 스타인하트
승인된 사용자:테일러 블라우
으로 git-upload-pack(1), git-receive-pack), git-receive-pack(1)을 수 .
transfer.hideRefs
하지만 지금 당장 모든 눈에 보이거나 숨겨진 참조 목록을 얻을 수 있는 쉬운 방법은 없습니다.
그러나 연결 검사의 성능 향상을 위해서는 이 작업이 필요합니다.옵션 새 션 가
--exclude-hidden=
음 다 유 참 숨 참 제 합 외 니 조 다 를 진 겨 사 서 에 조 - ▁that ▁like s 니 합 ▁excludes ▁any 다 외 제 ▁pseudo ▁ref 다 음 ref ▁next ▁the--all
또는--branches
.
rev-list-options
이제 관리 페이지에 다음 항목이 포함됩니다.
--exclude-hidden=[receive|uploadpack]
다음에 의해 숨겨진 참조를 포함하지 않습니다.
git-receive-pack
또는git-upload-pack
적절한 자문을 구함으로써.receive.hideRefs
또는uploadpack.hideRefs
및 성transfer.hideRefs
( 참조).이 옵션은 다음 유사 참조 옵션에 영향을 줍니다.--all
또는--glob
처리 후 삭제됩니다.
그리고:
rev-parse
덧셈--exclude-hidden=
패트릭 스타인하트
승인된 사용자:테일러 블라우
새가
--exclude-hidden=
방금 git-rev-list(1)에 추가한 옵션과 유사한 옵션입니다.
이름 섹션름 정지이지uploadpack
또는receive
주장으로서, 그것은 우리로 하여금 각각에 의해 가려질 모든 참조를 배제하게 합니다.$section.hideRefs
배열.
git rev-parse
이제 관리 페이지에 다음 항목이 포함됩니다.
--exclude-hidden=[receive|uploadpack]
다음에 의해 숨겨진 참조를 포함하지 않습니다.
git-receive-pack
또는git-upload-pack
적절한 자문을 구함으로써.receive.hideRefs
또는uploadpack.hideRefs
및 성transfer.hideRefs
( 참조).이 옵션은 다음 유사 참조 옵션에 영향을 줍니다.--all
또는--glob
처리 후 삭제됩니다.
복제는 한 번만 수행되므로 원격 저장소의 복제본이 이미 있는 경우 해당 복제본에서 풀하더라도 모든 항목이 다시 다운로드되지 않습니다.풀링할 분기를 지정하거나 변경 사항을 가져와 원하는 커밋을 확인하십시오.
새 리포지토리에서 가져오는 것은 사용자가 가지고 있지 않은 변경 사항만 다운로드하기 때문에 대역폭이 매우 저렴합니다.Git이 최소한의 부하로 올바른 것을 만드는 것에 대해 생각해 보십시오.
은 Git은모든것다저니장합에 모든 합니다..git
폴더를 누릅니다.커밋을 가져와서 격리된 상태로 저장할 수 없습니다. 모든 조상이 필요합니다.그들은 상호 연관되어 있습니다.
그러나 다운로드 크기를 줄이려면 git에 특정 분기와 관련된 개체만 가져오도록 요청하거나 다음을 커밋할 수 있습니다.
git fetch origin refs/heads/branch:refs/remotes/origin/branch
하면 지점에 됩니다.branch
(그리고 당신이 그리워하는 것들만) 그리고 그것을 저장합니다.origin/branch
그런 다음 병합하거나 체크아웃할 수 있습니다.
또한 SHA1 커밋 ID만 지정할 수 있지만 전체 40자의 생략되지 않은 식별자를 사용해야 합니다.
git fetch origin 96de5297df87096de5297df87096de5297df8709:refs/remotes/origin/foo-commit
하지 않는)인 SHA-196de5297df87096de5297df8709로됩니다.origin/foo-commit
.
원격 레포의 단일 커밋을 간단하게 가져올 수 있습니다.
git fetch <repo> <commit-id>
어디에,
<repo>
이름 원저소수예있다니습일이름장)일 수 .origin
URL ) 또원격repo URL(":https://git.foo.com/myrepo.git
)<commit-id>
입니다.
예를들면
git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545
커밋(그리고 사라진 조상)을 가져온 후에는 간단히 확인할 수 있습니다.
git checkout FETCH_HEAD
이렇게 하면 "분리 헤드" 상태가 됩니다.
나는 나의 Git repo를 잡아당겼습니다.
git pull --rebase <repo> <branch>
Git가 지점의 모든 코드를 입력할 수 있도록 허용한 다음 저는 관심 있는 커밋으로 재설정했습니다.
git reset --hard <commit-hash>
이게 도움이 되길 바랍니다.
다음을 사용하여 원격 repo를 쉽게 가져올 수 있습니다.
git fetch <repo>
어디에,
<repo>
이름 원저소수예있다니습일이름장)일 수 .origin
URL ) 또원격repo URL(":https://git.foo.com/myrepo.git
)
예:
git fetch https://git.foo.com/myrepo.git
저장소를 가져온 후 원하는 커밋을 병합할 수 있습니다(질문이 하나의 커밋을 검색하는 것이므로 병합 대신 체리픽을 사용하여 하나의 커밋만 선택할 수 있습니다).
git merge <commit>
<commit>
SHA1 커밋이 될 수 있습니다.
예:
git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545
또는
git merge 0a071603d87e0b89738599c160583a19a6d95545
병합할 최신 커밋인 경우 FETCH_HEAD 변수를 사용할 수도 있습니다.
git cherry-pick (or merge) FETCH_HEAD
이것이 가장 효과적입니다.
git fetch origin specific_commit
git checkout -b temp FETCH_HEAD
원하는 대로 이름을 대봐요하지만 이 가지는 고아일 수 있습니다.
저는 'gitts-remote'(http://git-scm.com/docs/git-ls-remote )가 당신이 원하는 것을 해야 한다고 생각합니다.강제로 가져오거나 당기지 않습니다.
마침내 나는 깃체리픽을 사용하여 특정 커밋을 복제하는 방법을 찾았습니다.로컬에 저장소가 없고 원격에서 특정 커밋을 가져온다고 가정하면,
로컬에 빈 리포지토리를 생성하고 git init
git remote add origin "저장소의 URL"
git fetch origin [ 병합하지 않으면 파일이 로컬 작업 공간으로 이동되지 않습니다.]
git cherry-pick "Enter-long-commit-Hash-That-You need"
완료. 이렇게 하면 로컬에 있는 특정 커밋의 파일만 남게 됩니다.
긴 커밋 해시 입력:
이것은 -> git log --session= online을 사용하여 얻을 수 있습니다.
요청된 커밋이 원격 repo의 꺼내기 요청에 있는 경우 해당 ID로 가져올 수 있습니다.
# Add the remote repo path, let's call it 'upstream':
git remote add upstream https://github.com/repo/project.git
# checkout the pull ID, for example ID '60':
git fetch upstream pull/60/head && git checkout FETCH_HEAD
# make sure you fetch from the origin first
$ git fetch origin
# view code at COMMIT_ID (abc123)
$ git checkout abc123
# bring only COMMIT_ID (abc123)
# to your branch
# assuming your branch is master
$ git checkout master
$ git cherry-pick abc123
# bring all changes up to
# COMMIT_ID (abc123) to your branch
# assuming your branch is master
$ git checkout master
$ git merge abc123
참조 - https://unfuddle.com/stack/tips-tricks/git-pull-specific-commit/
프로젝트에서 우리는 문제가 있어서 일정한 약속으로 돌아가야 했습니다.다음 명령을 사용하여 성공적으로 만들었습니다.
git reset --hard <commitID>
언급URL : https://stackoverflow.com/questions/14872486/retrieve-specific-commit-from-a-remote-git-repository
'programing' 카테고리의 다른 글
PostgreSQL 인덱스 사용 분석 (0) | 2023.06.19 |
---|---|
스프링 부트 테스트 @ 트랜잭션이 저장되지 않음 (0) | 2023.06.19 |
화면 업데이트의 효과 (0) | 2023.06.19 |
확인하지 못했습니다. com.google.파이어베이스:파이어베이스 코어:9.0.0 (0) | 2023.06.19 |
SQL insert 문에서 비트 값을 반전하는 우아한 방법이 있습니까? (0) | 2023.06.19 |