원격 Git 저장소에서 특정 커밋 검색 방법이 있습니까?

내 PC에서 복제하지 않고 원격 Git 저장소에서 특정 커밋을 하나만 검색하는 방법이 있습니까? 원격 저장소의 구조는 내 구조와 완전히 동일하므로 충돌이 발생하지 않지만 어떻게 해야할지 모르겠으며 거대한 저장소를 복제하고 싶지 않습니다.

나는 자식을 처음 사용하는데 어떤 방법이 있습니까?



답변

Git 버전 2.5 이상 (Q2 2015)부터는 전체 커밋을 복제하지 않고 단일 커밋을 가져 오는 것이 실제로 가능합니다.

참조 68ee628을 투입 하여 프레드릭 메들리 ( moroten) 5 월 21 일 2015 년
(에 의해 합병 Junio C 하마노 – gitstera9d3493 커밋 2015 6월 1일)

이제 서버 측에 새로운 구성이 있습니다.

uploadpack.allowReachableSHA1InWant

upload-pack참조 팁에서 도달 할 수있는 객체를 요청하는 가져 오기 요청을 허용 합니다. 그러나 객체 도달 가능성을 계산하는 것은 계산 비용이 많이 듭니다.
기본값은 false입니다.

해당 서버 측 구성을 단순 복제본 ( git fetch --depth=1) 과 결합 하면 단일 커밋을 요청할 수 있습니다 (참조 t/t5516-fetch-push.sh:

git fetch --depth=1 ../testrepo/.git $SHA1

git cat-file명령을 사용하여 커밋이 페치되었음을 확인할 수 있습니다 .

git cat-file commit $SHA1

git upload-pack“를 제공하는 ” git fetch“는 uploadpack.allowReachableSHA1InWant
구성 변수 를 사용하여 참조에서 도달 할 수있는 한 참조의 끝에없는 커밋을 제공하도록 지시 할 수 있습니다 .


전체 문서는 다음과 같습니다.

upload-pack: 선택적으로 도달 가능한 sha1 가져 오기 허용

uploadpack.allowReachableSHA1InWant서버 측에 구성 옵션이 설정되어 있으면 ” git fetch“는 광고되지 않은 오브젝트의 이름을 지정하는 “want”행을 사용하여 요청할 수 있습니다 (대역 외부 또는 서브 모듈 포인터에서 얻은 것 같습니다).
분기 팁에서 도달 할 수있는 개체, 즉에 의해 광고 된 분기와 분기의 합집합 transfer.hideRefs만 처리됩니다.
연결 가능성을 확인하기 위해 기록을 다시 걸어야하는 관련 비용이 있습니다.

이 기능은 특히 얕은 가져 오기가 사용되는 경우 전체 저장소를 복제 할 필요없이 sha1이 알려진 특정 커밋의 컨텐츠를 가져올 때 사용할 수 있습니다.

유용한 사례는 예를 들어

  • 히스토리에 큰 파일이 포함 된 저장소
  • 서브 모듈 체크 아웃에 필요한 데이터 만 가져 오기
  • 변경 번호 대신 커밋의 관점에서 생각하는 경우 Ger1에 속한 정확한 지점을 알려주지 않고 sha1을 공유 할 때.
    (Gerrit 사례는 allowTipSHA1InWant모든 Gerrit 변경이 참조 할 때 이미 해결되었습니다 .)

Git 2.6 (2015 년 3 분기)은이 모델을 개선 할 것입니다. Jeff King ( )의 commit 2bc31d1 , commit cc118a6 (2015 년 7 월 28 일)을
참조하십시오 . ( Junio ​​C Hamano의해 합병 커밋 824a0be , 2015 년 8 월 19 일)peff
gitster

refs: 부정적인 지원 transfer.hideRefs

transfer.hideRefs구성을 사용하여 참조의 계층 구조를 숨기면 나중에 해당 구성을 재정 의하여 “숨기기 해제”할 수 없습니다.
이 패치는 “부정적인”숨기기를 구현하여 다른 일치하는 것이 숨겨져 있어도 일치하지 않는 것으로 표시됩니다.
우리는 구성 기계 장치가 우리에게 공급하는 방식에서 역순으로 경기를 역순으로 적용하는데, 이는 우리의 일반적인 “마지막 승리”구성 우선 순위 작업을 가능하게합니다 ( .git/config예를 들어,의 항목 은 재정의 함 /etc/gitconfig).

이제 할 수 있습니다 :

git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'

refs/secret특정 리포지토리에서 하나의 퍼블릭 비트를 제외하고 모든 리포지토리에서 숨길 수 있습니다.


힘내 2.7 (2015 년 11 월 / 12 월)이 다시 개선됩니다 :

참조 948bfa2 커밋 , 00b293e 커밋 (2015 11월 5일를) 78a766a 커밋 , 92cab49 커밋 , 92cab49 커밋 , 92cab49 커밋 (2015 11월 3일), 00b293e 커밋 , 00b293e 커밋 (2015 11월 5일을), 및 92cab49 커밋 , 92cab49 커밋 , 92cab49 커밋 , Lukas Fleischer ( )의 커밋 92cab49 (2015 년 11 월 3 일 ) .
도움 : Eric Sunshine ( ) . (가 합병 제프 킹 – dbba85e 커밋 , 2015년 11월 20일)lfos
sunshineco
peff

config.txt: hideRefs네임 스페이스로 의미를 문서화

현재 transfer.hideRefs네임 스페이스가 설정 될 때 어떻게 동작해야하는지 에 대한 명확한 정의는 없습니다 . 이 경우 접두사가 제거 된 이름과 일치
한다고 설명하십시오 hideRefs. hideRefs수신 팩에서 현재 패턴을 처리 하는 방법 입니다.

hideRefs : 전체 심판 일치 지원 추가

벗겨진 참조를 일치시키는 것 외에도 이제 hideRefs전체 ( 스트립되지 않은) 참조가 일치하는 패턴을 추가 할 수 있습니다 .
제거 된 일치 항목과 완전 일치 항목을 구분하려면 이러한 새 패턴 앞에 접곡 부호 ( ^)를 붙여야합니다 .

따라서 새로운 문서 :

transfer.hideRefs:

네임 스페이스가 사용중인 경우 네임 스페이스 접두사는 transfer.hiderefs패턴 과 일치하기 전에 각 참조에서 제거됩니다 .
예를 들어,이 refs/heads/master에 지정되어 transfer.hideRefs현재 네임 스페이스가되어 foo, 다음 refs/namespaces/foo/refs/heads/master
광고들에서 생략되어 있지만 refs/heads/master
refs/namespaces/bar/refs/heads/master여전히 소위 “이”선으로 광고됩니다.
벗기기 전에 심판을 일치 ^시키려면 심판 이름 앞에를 추가하십시오 . 당신이 결합하는 경우 !^, !먼저 지정해야합니다.


R .. 은 주석 에서 config를 언급 하며uploadpack.allowAnySHA1InWant , 이는 객체를 요청 upload-pack하는 fetch요청 을 받아 들일 수 있습니다 . (기본값은 false)입니다.

David “novalis”Turner ( )의 커밋 f8edeaa (2016 년 11 월, Git v2.11.1)를 참조하십시오 .novalis

upload-pack: 선택적으로 sha1 가져 오기 허용

우리가 사용자가 저장소의 모든 것에 절대적으로 액세스 할 것을 신뢰하는 경우 도달 가능성 검사를하는 것은 약간 어리석은 것처럼 보입니다.

또한 분산 시스템에서는 비참합니다. 어쩌면 한 서버는 심판을 광고하지만 다른 서버는 그 심판에 강제로 밀렸으며 두 HTTP 요청은 이러한 다른 서버로 향하게됩니다.


답변

한 번만 복제하므로 이미 원격 저장소의 복제본이있는 경우 복제하면 모든 항목이 다시 다운로드되지 않습니다. 가져 오려는 분기를 표시하거나 변경 사항을 가져오고 원하는 커밋을 체크 아웃하십시오.

새로운 저장소에서 가져 오는 것은 대역폭 이 매우 저렴합니다. 변경 사항이없는 경우에만 다운로드하기 때문입니다. 최소한의 부하로 Git이 올바른 일을한다고 생각하십시오.

Git은 모든 것을 .git폴더에 저장 합니다. 커밋은 가져 와서 분리하여 저장할 수 없으며 모든 조상이 필요합니다. 그들은 서로 관련되어 있습니다.


그러나 다운로드 크기를 줄이려면 git에게 특정 브랜치 또는 커밋과 관련된 객체 만 가져 오도록 요청할 수 있습니다.

git fetch origin refs/heads/branch:refs/remotes/origin/branch

이것은 원격 브랜치 branch (그리고 당신이 놓친 것)에 포함 된 커밋 만 다운로드 하여 저장합니다 origin/branch. 그런 다음 병합 또는 체크 아웃 할 수 있습니다.

SHA1 커밋 만 지정할 수도 있습니다.

git fetch origin 96de5297df870:refs/remotes/origin/foo-commit

이것은 지정된 SHA-1 96de5297df870 (그리고 당신이 놓친 조상)의 커밋 만 다운로드하고 (존재하지 않는) 원격 브랜치로 저장합니다 origin/foo-commit.


답변

git repo를 가져 왔습니다.

git pull --rebase <repo> <branch>

git이 브랜치의 모든 코드를 가져 오도록 허용 한 다음 관심있는 커밋으로 재설정했습니다.

git reset --hard <commit-hash>

도움이 되었기를 바랍니다.


답변

당신은 단순히 원격 저장소의 단일 커밋을 가져올 수 있습니다

git fetch <repo> <commit>

어디,

  • <repo>원격 REPO 이름 (예, 할 수 있습니다 origin(예를) 또는 원격의 repo URL을 https://git.foo.com/myrepo.git)
  • <commit> SHA1 커밋이 될 수 있습니다

예를 들어

git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545

커밋 (및 누락 된 조상)을 가져온 후에는 간단히 커밋을 할 수 있습니다

git checkout FETCH_HEAD

이렇게하면 “분리 된 헤드”상태가됩니다.


답변

다음과 같이 간단히 원격 저장소를 가져올 수 있습니다.

git fetch <repo>

어디,

  • <repo>원격 REPO 이름 (예, 할 수 있습니다 origin(예를) 또는 원격의 repo URL을 https://git.foo.com/myrepo.git)

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

git fetch https://git.foo.com/myrepo.git

repos를 가져온 후 원하는 커밋을 병합 할 수 있습니다 (질문은 하나의 커밋을 검색하는 것이기 때문에 병합 대신 cherry-pick을 사용하여 하나의 커밋을 선택할 수 있습니다).

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

원하는 이름을 “temp”로 지정합니다.이 분기는 분리 될 수 있습니다.


답변

마지막으로 git cherry-pick을 사용하여 특정 커밋을 복제하는 방법을 찾았 습니다 . 로컬에 리포지토리가 없으며 원격에서 특정 커밋을 가져오고 있다고 가정하면,

1) 로컬 및 git init 에 빈 저장소를 만듭니다.

2) git remote add originurl-of-repository

3) git fetch origin [이것은 병합하지 않으면 파일을 로컬 작업 공간으로 이동시키지 않습니다]

4) git cherry-pickEnter-long-commit-hash-that-you- 필요한

이렇게하면 로컬에 해당 커밋의 파일 만 있습니다.

긴 커밋 해시 입력 :

이것을 사용하여 얻을 수 있습니다-> git log –pretty = oneline