programing

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

i4 2023. 8. 29. 20:10
반응형

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

저장소에서 특정 커밋(예: 깊이 1)을 얕은 수준으로 복제할 수 있습니까?비슷한 것

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

SHA와의 커밋에서 저장소 상태를 그대로 가져옵니다.728a4d...?

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

Git 2.5.0부터(클라이언트와 서버 측 모두에서 사용 가능해야 함) 설정 가능uploadpack.allowReachableSHA1InWant=true특정 SHA1의 가져오기를 활성화하려면 서버 측에서 다음 작업을 수행합니다(약어가 아닌 전체 SHA1이어야 함).

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

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

참고: 이 예제는 커밋 해시를 사용하여 복제하는 데 도움이 되지 않지만 태그를 복제하고 경량 저장소를 사용하는 데 도움이 됩니다.

"클론"에 커밋이 하나만 있어야 하고 커밋 해시를 사용하려면 간단한 대답은 "아니오"입니다.

다음 명령 구성(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

.gitdir 크기(전체 사용 시 267K 대 2.6M)clone):

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

제가 말씀드리고 싶은 것은,--branch태그/태그를 사용할 수 있습니다.

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

--branch또한 태그를 사용하여 결과 저장소의 해당 커밋에서 HEAD를 분리할 수 있습니다.

업데이

간단히 말해서, "refs"를 사용할 수 있습니다.자세한 내용은 여기를 참조하십시오.Git 오류 메시지 "Server not allowed for unadvertised object"는 무엇을 의미합니까?

또한 다음과 같은 속임수는 없습니다.

git fetch --depth 1 origin <COMMIT_HASH>

@BenjiWiebe가 제 실수를 지적해 주셔서 감사합니다.

사용해 보십시오.whilebash:

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

이는 각 커밋을 개별적으로 가져오기 때문에 매우 느립니다. 증분을 증가시킬 수 있지만(커밋을 일괄적으로 가져오고 네트워크를 통해 성능을 향상시키기 위해) 여전히 강력한 접근 방식입니다.

즉각적인 대답은: 깃 클론을 사용하여 직접 수행할 수 없다는 것입니다.
이유는 다음과 같습니다.Git Clone 특정 커밋 옵션이 없는 이유는 무엇입니까?

또 뭐 할 수 있어요?

리포지토리를 특정 커밋으로 복제하는 방법은 무엇입니까?(전체 클론)

# 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>

https://stackoverflow.com/a/43136160/4411491 의 답변은 작동하지만 분리된 헤드를 생성합니다.다음과 같이 약간 수정하면 이 문제가 방지되어 단일 커밋 체크아웃이 정기적으로 발생합니다.

# Set those variables:
repourl='https://some.test/somerepo.git'
commit=4e1243bd22c66e76c2ba9eddc1f91394e57f9f83

# Paste the remaining commands unmodified into your shell.       
: ${repourl:?}; reponame=${repourl##*/}; reponame=${reponame%.git}
git init -- "${reponame:?}"
cd -- "${reponame:?}"
git remote add origin "${repourl:?}"
git fetch -q --depth=1 origin "${commit:?}"
git reset --hard FETCH_HEAD

$commit은 반드시 전체 commit ID로 설정해야 합니다.커밋 ID의 약어는 작동하지 않습니다.

언급URL : https://stackoverflow.com/questions/31278902/how-to-shallow-clone-a-specific-commit-with-depth-1

반응형