Git 프로젝트의 일부만 복제할 수 있나요?

Git 프로젝트의 일부만 복제할 수 있나요?

GitHub에서 필요한 slackbuilds 컬렉션을 찾았습니다. https://github.com/PhantomX/slackbuilds/ 나는 모든 자식을 얻고 싶지 않습니다.

git clone https://github.com/PhantomX/slackbuilds.git

하지만 slackbuild만 얻을 수 있습니다.이것.

어떻게 해야 하나요? 가능합니까?

답변1

전체 내역을 다운로드하게 되므로 큰 이점은 없지만 "희소" 체크아웃을 사용하여 특정 부분을 체크아웃할 수 있습니다. 인용하다이 스택 오버플로 게시물:

희소화 단계클론아래에 명시된 바와 같이:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

여기서 끊겠습니다. 다른 글을 인용했기 때문에 인용된 부분을 편집하고 싶지는 않지만,하다아니요-f와 함께 사용됩니다 git remote add. 전체 기록을 가져오는 가져오기를 수행합니다. 다음을 얻지 않고 리모컨을 추가하십시오.

git remote add origin <url>

그런 다음 나중에 설명하는 대로 얕은 획득을 수행합니다.

이렇게 하면 리모컨으로 빈 저장소가 생성되고 모든 개체를 가져오지만 체크아웃할 수는 없습니다. 그런 다음 다음을 수행하십시오.

git config core.sparseCheckout true

이제 실제로 체크아웃할 파일/폴더를 정의해야 합니다. 이는 .git/info/sparse-checkout다음과 같이 나열하여 수행됩니다 .

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

[...]

한 번 살펴보고 싶을 수도 있습니다확장 튜토리얼아마도 공식을 읽어야 할 것입니다.스파스 체크아웃에 대한 문서.

아마도 다음을 사용하는 것이 더 나을 것입니다.얕은 클론. 일반적인 방법 대신 다음을 git pull시도해 보세요.

git pull --depth=1 origin master

나는 최근에 이것을 다시 테스트할 기회가 있었습니다.Ubuntu Mono Powerline 글꼴. 위 단계에서는 약 11MB를 다운로드했으며 그 중 Ubuntu 글꼴 자체는 약 900KB였습니다.

% git pull --depth=1 origin master
remote: Enumerating objects: 310, done.
remote: Counting objects: 100% (310/310), done.
remote: Compressing objects: 100% (236/236), done.
remote: Total 310 (delta 75), reused 260 (delta 71), pack-reused 0
Receiving objects: 100% (310/310), 10.40 MiB | 3.25 MiB/s, done.
Resolving deltas: 100% (75/75), done.
From https://github.com/powerline/fonts
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
% du -hxd1 .
11M     ./.git
824K    ./UbuntuMono
12M     .

일반적으로 clone약 20MB가 소요됩니다. 약간의 절감 효과가 있지만 충분하지 않습니다.

사용--filter+ Ciro Santilli 답변의 결제 방법크기는 줄어들지만 앞서 언급한 것처럼 각 Blob이 하나씩 다운로드되므로 속도가 느립니다.

% git fetch --depth=1 --filter=blob:none
remote: Enumerating objects: 52, done.
remote: Counting objects: 100% (52/52), done.
remote: Compressing objects: 100% (49/49), done.
remote: Total 52 (delta 1), reused 35 (delta 1), pack-reused 0
Receiving objects: 100% (52/52), 14.55 KiB | 1.32 MiB/s, done.
Resolving deltas: 100% (1/1), done.
From https://github.com/powerline/fonts
 * [new branch]      master     -> origin/master
 * [new branch]      terminus   -> origin/terminus
% git checkout origin/master -- UbuntuMono
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 1.98 KiB | 1.98 MiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 581 bytes | 581.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 121.43 KiB | 609.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 100.66 KiB | 512.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 107.62 KiB | 583.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 112.15 KiB | 791.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 454 bytes | 454.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 468 bytes | 468.00 KiB/s, done.
% du -hxd1 .
692K    ./.git
824K    ./UbuntuMono
1.5M    .

핵심요약: --filter전체 다운로드 수를 줄이려면 전체, 희소 체크아웃 및 얕은 복제를 사용하세요. 또는 총 다운로드 수에 신경 쓰지 않고 디렉터리 하나만 원하는 경우(어떻게 얻든) 희소 체크아웃 + 얕은 복제를 사용하세요.

답변2

git clone --filter+ git sparse-checkout필요한 파일만 다운로드

small/예를 들어, 이 테스트 저장소의 하위 디렉터리에 있는 파일 만 복제하려면 다음을 수행하세요 .https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree

git clone -n --depth=1 --filter=tree:0 \
  https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree
cd test-git-partial-clone-big-small-no-bigtree
git sparse-checkout set --no-cone small
git checkout

다운로드할 디렉터리를 여러 개 선택할 수도 있습니다.

git sparse-checkout set --no-cone small small2

그러나 이 방법은 단일 파일에는 작동하지 않지만 다른 방법은 다음과 같습니다.https://stackoverflow.com/questions/2466735/how-to-sparsely-checkout-only-one-single-file-from-a-git-repository/52270527#52270527

이 테스트에서는 복제가 본질적으로 즉각적으로 이루어졌으며 예상한 대로 복제된 저장소가 매우 작다는 것을 확인할 수 있었습니다.

du --apparent-size -hs * .* | sort -hs

주다:

2.0K    small
226K    .git

테스트 저장소에는 다음이 포함됩니다.

  • big/10MB 파일 10개가 포함된 하위 디렉터리
  • 10x 10MB 파일 0, 1, ... 9최상위 수준(이전 시도에서 최상위 수준 파일을 다운로드했기 때문입니다)
  • a small/small2/하위 디렉터리에는 1000개의 파일이 포함되어 있으며 각 파일 크기는 1바이트입니다.

모든 것이 의사 무작위이므로 압축할 수 없으므로 대용량 파일이 다운로드되었는지 쉽게 알 수 있습니다.그리고ncdu.

따라서 필요하지 않은 것을 다운로드하면 100MB의 추가 공간을 얻게 되는데 이는 매우 눈에 띌 것입니다.

위에서는 git clone단일 객체, 아마도 커밋을 다운로드합니다.

Cloning into 'test-git-partial-clone-big-small'...
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), done.

그런 다음 최종 체크아웃에서는 요청한 파일을 다운로드합니다.

remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), 10.19 KiB | 2.04 MiB/s, done.
remote: Enumerating objects: 253, done.
remote: Counting objects: 100% (253/253), done.
Receiving objects: 100% (253/253), 2.50 KiB | 2.50 MiB/s, done.
remote: Total 253 (delta 0), reused 253 (delta 0), pack-reused 0
Your branch is up to date with 'origin/master'.

2023년 1월 git 2.37.2, Ubuntu 22.10에서 테스트되었습니다.

TODO는 또한 원치 않는 트리 개체가 다운로드되는 것을 방지합니다.

위의 모든 방법을 다운로드하십시오.Git 트리 객체(즉, 디렉토리 목록이지만 실제 파일 내용은 아닙니다.) 다음을 실행하여 이를 확인할 수 있습니다.

git ls-files

다음과 같은 대용량 파일의 디렉터리가 포함되어 있는지 확인하세요.

big/0

대부분의 프로젝트에서는 이것이 문제가 되지 않지만 내 안의 완벽주의자는 이를 피하고 싶어합니다.

또한 다음 디렉토리 아래에 매우 큰 트리 개체(100MB)가 포함된 매우 극단적인 저장소를 만들었습니다 big_tree.https://github.com/cirosantilli/test-git-partial-clone-big-small

small/누군가 디렉토리를 복제하는 방법을 찾으면 알려주세요!

명령 정보

--filter옵션은 원격 프로토콜 업데이트와 함께 추가되었으며 서버에서 개체가 다운로드되는 것을 방지합니다.

아쉽게도 이 sparse-checkout부분도 꼭 필요한 부분입니다. 또한 이해하기 쉬운 특정 파일만 다운로드할 수도 있습니다.

git clone --depth 1  --filter=blob:none  --no-checkout \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git checkout master -- d1

그런데 이 방법은 어떤 이유에서인지파일을 하나씩 다운로드하는 것이 매우 느립니다., 디렉토리에 파일이 거의 없으면 사용할 수 없습니다.

덜 상세하지만 실패한 또 다른 시도는 다음과 같습니다.

git clone --depth 1 --filter=blob:none --sparse \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git sparse-checkout set small

하지만 이렇게 하면 최상위 디렉터리의 모든 파일이 다운로드됩니다.https://stackoverflow.com/questions/75311408/how-to-prevent-git-clone-filter-blobnone-sparse-from-downloading-files-on-t

꿈: 모든 디렉터리에는 웹 인터페이스 메타데이터가 있을 수 있습니다.

이 기능은 Git에 혁명을 일으킬 수 있습니다.

기업의 코드 베이스를 모두 소유한다고 상상해 보세요.단일 단일 저장소에서아니요다음과 같은 못생긴 타사 도구repo.

상상하다보기 흉한 타사 확장 기능 없이 거대한 Blob을 저장소에 직접 저장합니다..

GitHub가 허용되는지 상상해보세요파일/디렉터리별 메타데이터별표 및 권한과 마찬가지로 모든 개인 콘텐츠를 하나의 저장소에 저장할 수 있습니다.

상상해 보세요서브모듈은 일반 디렉토리와 똑같이 처리됩니다.: 트리 SHA와DNS와 유사한 메커니즘으로 요청을 해결합니다., 먼저 당신의현지의~/.git, 먼저 더 가까운 서버(기업의 미러/캐시)로 이동하고 결국에는 GitHub로 이동합니다.

나에게는 꿈이 있습니다.

테스트 콘 모노레포 개념

이는 하위 모듈 없이 단일 저장소를 유지 관리하는 데 가능한 아이디어입니다.

하위 모듈과 하위 모듈이 아닌 구성 요소가 있는 변경 작업을 수행할 때마다 두 개의 별도 저장소에 커밋해야 하는 것이 귀찮기 때문에 하위 모듈 사용을 피하고 싶습니다.

Makefile 또는 이와 유사한 것이 있는 모든 디렉토리는 자체적으로 구축되고 테스트되어야 합니다.

이러한 디렉터리는 다음에 따라 달라질 수 있습니다.

  • 그 아래의 모든 파일과 하위 디렉터리는 최신 버전으로 직접 유지됩니다.
  • 외부 디렉터리는 지정된 버전에만 의존할 수 있습니다.

git이 이 기능을 기본적으로 지원하기 시작할 때까지(즉, 하위 디렉터리의 하위 모듈만 추적할 수 있음) git 추적 파일의 일부 메타데이터를 사용하여 이 기능을 지원할 수 있습니다.

모노레포.json

{
    "path": "some/useful/lib",
    "sha": 12341234123412341234,
}

여기서는 sha전체 저장소에 대한 공통 SHA를 나타냅니다. 그런 다음 gitignored 폴더와 같은 디렉터리를 확인하는 스크립트가 필요합니다 monorepo.

monorepo/som/useful/lib

파일을 변경할 때마다 트리의 Makefile이 있는 모든 디렉터리를 테스트해야 합니다. 이는 디렉토리가 하위 디렉토리의 최신 버전에 따라 달라질 수 있으므로 항상 위의 내용이 손상될 가능성이 있기 때문입니다.

관련된:

답변3

이 시도:

svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}

답변4

위와 같은 이유로 결국 성공했습니다. 파일을 직접 편집했는데 실수로 인용부호를 포함해서 오류가 났습니다. .git/info/sparse-checkout 파일에는 따옴표 없이 디렉터리만 포함되어야 합니다. 예를 들면 다음과 같습니다. 이 거대한 프로젝트는 다음과 같습니다.https://github.com/SharePoint/sp-dev-fx-webparts, 나는 예제 디렉토리의 반응 스크립트 편집기만 원합니다. https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-script-editor

위의 지침을 따랐고 .git/info/sparse-checkout 파일에 이 내용이 있으면 작동하기 시작했습니다.

샘플/반응 스크립트 편집기

관련 정보