programing

원격 Git 저장소에서 특정 커밋 검색

javamemo 2023. 6. 19. 21:05
반응형

원격 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 peffKing() 참조.
(주니오 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-packwant-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는 면에반이, 는히그를언않지급심하가고판, 전을이리이것다객키는니체입")..have" 라인).


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

반응형