전체 리포지토리를 먼저 체크 아웃하지 않고 스파 스 체크 아웃을 수행 할 수 있습니까?


171

체크 아웃하는 데 몇 시간이 걸리는 매우 많은 파일이있는 저장소를 사용하고 있습니다. Git이 희소 한 체크 아웃을 지원하므로 Git 이이 종류의 저장소와 잘 작동하는지 가능성을 찾고 있지만 찾을 수있는 모든 예제는 다음을 수행합니다.

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

이 명령 시퀀스의 문제점은 원래 클론도 체크 아웃을 수행한다는 것입니다. 원래 복제 명령에 -n을 추가하면 읽기 트리 명령으로 인해 다음 오류가 발생합니다.

오류 : 스파 스 체크 아웃시 작업 디렉토리에 항목이 남지 않습니다.

모든 파일을 먼저 체크 아웃하지 않고 어떻게 스파 스 체크 아웃을 수행 할 수 있습니까?



참고 : git 2.9 (2016 년 7 월) git worktree add --no-checkout에서만 작동 git clone --no-checkout합니다. 아래 답변을
VonC

여기에 모든 솔루션을 시도한 후, 단지 디렉토리 (NO 후 밀어를!) 다운로드 유일한 사람입니다 .
LondonRob 2012 년

답변:


24

2020 년에는 .git 파일에 대한 걱정없이 스파 스 체크 아웃을 처리하는 간단한 방법이 있습니다. 내가 한 방법은 다음과 같습니다.

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

git 버전 2.25가 설치되어 있어야합니다. https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ 에 대해 자세히 알아보십시오.

최신 정보:

위의 git clone명령은 파일을 체크 아웃하지 않고 여전히 전체 기록으로 repo를 복제합니다. 전체 히스토리가 필요하지 않은 경우 다음 과 같이 --depth 매개 변수를 명령에 추가 할 수 있습니다 .

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1

1
사실, 좋은 지적입니다. 공감. 나는 stackoverflow.com/a/59515426/6309sparse-checkout --cone
VonC

--filter여기에 답변에 부분 클론 ( )을 추가하는 것이 좋습니다.
Tao

@ alexey-grinko, 첫 번째 명령은 여전히 ​​확인하지 않아도 문제의 전체 저장소를 복제해야했습니다 ... 필요하지 않은 모든 항목을 복제하지 않는 시간을 절약하려고했습니다. .
mropp

1
@mropp, --depth얕은 복제를 수행 할 수있는 매개 변수를 추가하여 답변을 업데이트했습니다 . 도움이 될까요? @Tao, --filter이 경우 사용법을 잘 모르겠지만 시도하지 않았습니다. 이 주제에 대한 예를 제공하거나 다른 답변을 게시 할 수 있습니까?
Alexey Grinko

4
2.27 릴리스에서는 동일하게 작동하지 않습니다. 이유를 모르겠습니다.
반점

162

이 답변은 리포지토리에서 데이터의 전체 복사본을 다운로드합니다. 이 git remote add -f명령은 전체 저장소를 복제합니다. 의 맨 페이지에서git-remote :

-f옵션을 사용 git fetch <name>하면 원격 정보가 설정된 직후에 실행됩니다.


이 시도:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

이제 path / within_repo / to / desired_subdir (및 해당 경로)에있는 파일 만 사용하여 "정리 된"체크 아웃 된 것을 확인할 수 있습니다.

Windows 명령 행에서 경로를 인용해서는 안됩니다. 즉, 다음과 같이 6 번째 명령을 변경해야합니다.

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

그렇지 않으면 스파 스 체크 아웃 파일에 따옴표가 나오고 작동하지 않습니다.


3
"git checkout [branchname]"명령을 사용할 수 없습니다 (오류 발견 : 스파 스 체크 아웃은 작업 디렉토리에 항목을 남기지 않음). "git pull origin master"를 사용했는데 제대로 작동합니다.
Natty

2
리눅스에서 git 버전 1.7.2.5를 사용하면 다음과 같은 결과를 얻었습니다. echo 'dir / *'는 dir /의 파일 검사 하고 하위 디렉토리 는 검사 하지 않습니다. echo 'dir /'(별표 없음!)은 dir / 아래의 전체 트리를 올바르게 체크 아웃합니다. HTH
pavek

37
"git remote"명령으로 전체 저장소가 체크 아웃되었습니다-bam! - 바로 그때; 따라서 "git config ..."및 다음 명령에서 관심있는 하위 디렉토리 지정은 영향을 미치지 않습니다. "git remote"명령에 repo URL이 최상위 .git 파일의 경로 만 지정되어 있습니까? 아니면 관심있는 하위 디렉토리의 경로 여야합니까?
Rob Cranfill

10
다음은 간소화 된 버전입니다 (디렉토리를 수동으로 만들 필요가 없으며 init 및 원격 추가 할 필요가 없습니다. @onionjake에서 언급 한 것처럼 --no-checkout 옵션으로 일반 git clone + checkout주기를 수행하십시오) : git clone --no-checkout <프로젝트> cd <프로젝트> echo <dir>> .git / info / sparse-checkout git checkout <branch>
Gregor

22
git remote add명령 -f은 스파 스 체크 아웃 옵션을 정의하기 전에 즉시 가져 오도록 지시 하기 때문에 모든 것을 다운로드 합니다. 그러나 생략하거나 재정렬하면 도움이되지 않습니다. 스파 스 체크 아웃은 리포지토리가 아닌 작업 트리에만 영향을줍니다. 저장소가 대신 다이어트를 진행하려면 --depth또는 --single-branch옵션을 대신 살펴 봐야 합니다.
Miral

43

Git clone에는 원하는 작업을 수행 하는 옵션 ( --no-checkout또는 -n)이 있습니다.

명령 목록에서 다음을 변경하십시오.

git clone <path>

이에:

git clone --no-checkout <path>

그런 다음 질문에 명시된대로 스파 스 체크 아웃을 사용할 수 있습니다.


7
그래, 그것은 체크 아웃을하지 않지만 여전히 전체 저장소 기록을 다운로드하기 위해 가져옵니다
Jason S

9
@JasonS이 질문은 특히 체크 아웃하지 않은 것에 관한 것입니다. 전체 히스토리를 원하지 않으면 --depth <depth>git clone 의 옵션을 사용하십시오 . <depth>기록에서 마지막 커밋 만 다운로드합니다 . 현재 git을 사용하여 단일 커밋을 부분적으로 다운로드하는 방법은 없지만 원격에서 지원하는 경우 git archive --remote부분 파일 세트를 다운로드 하는 데 사용할 수 있습니다 .
onionjake

vfsforgit.org를 사용하여 파일을 다운로드하지 않고도 커밋을 '체크 아웃'할 수도 있습니다 . 누군가가 단일 커밋의 작은 하위 집합 만 체크 아웃하려고 할 때 유용 할 수 있습니다.
onionjake

22

태그에 대한 커밋 만 체크 아웃하고 디렉토리를 정리하려는 것을 제외하고는 비슷한 유스 케이스가있었습니다. 를 사용 --depth 1하면 정말 희박 해지고 실제로 속도를 높일 수 있습니다.

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url>  # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>

3
--depth 1은 얕은 복제본이라고하며 단지 FYI입니다.
Mark Allison

1
도움이되었습니다! 감사합니다
kp123

1
고마워 전체 저장소를 다운로드하지 못하게하는 다른 많은 방법을 시도한 후에 이것으로 올바르게했습니다.
J ... S

12

이전에 pavek (감사합니다!)이 게시 한 단일 라이너에서 찾고있는 답변을 찾았으므로 Linux에서 작동하는 단일 회신으로 완전한 답변을 제공하고 싶었습니다 (GIT 1.7.1).

1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master

나는 명령의 순서를 약간 변경했지만 아무런 영향을 미치지 않는 것 같습니다. 핵심은 5 단계 에서 경로 끝에 슬래시 "/"가 있다는 것입니다 .


3
이것이 당신이 원하는 것입니까? -f는 모든 데이터를 가져 오는 것을 의미하지만 원하지 않는 다른 모든 정보는 여전히 얻으며 느립니다. (여전히 "전체 저장소를 체크 아웃하고 있습니다")
Shuman

1
Windows에서 위의 단계를 시도했지만 명령 프롬프트에서 여분의 체크 아웃이 작동하지 않으므로 Git Bash 쉘을 사용해 보았습니다. 명령 프롬프트는 push, pull 등과 같은 모든 git 명령을 실행할 수 있지만 스파 스 체크 아웃에 실패하면 실패합니다.
user593029

서브 디렉토리의 파일 만 수행하는 방법 특정 하위 디렉토리 내부의 파일 만 가져오고 싶습니다.
Babish Shrestha

@BabishShrestha 다른 답변 FWIW에 onionjake의 코멘트 참조 : |
rogerdpack

9

슬프게도 위의 어느 것도 나를 위해 일하지 않았으므로 sparse-checkout파일의 다른 조합을 시도하는 데 오랜 시간을 보냈습니다 .

필자의 경우 IntelliJ IDEA 구성으로 폴더를 건너 뛰고 싶었습니다.

여기 내가 한 일이 있습니다.


운영 git clone https://github.com/myaccount/myrepo.git --no-checkout

운영 git config core.sparsecheckout true

.git\info\sparse-checkout다음 내용으로 작성

!.idea/*
!.idea_modules/*
/*

모든 파일을 얻으려면 'git checkout-'을 실행하십시오.


중요한 것은 /*폴더 이름 뒤에 추가하는 것이 었습니다 .

git 1.9가 있습니다


3
아니, 그것은 여전히 ​​모든 커밋과 모든 파일을 다운로드한다. git 2.3.2
Tyguy7

6
스파 스 체크 아웃은 작업 트리에만 영향을줍니다. 리포지토리 크기 나 가져 오는 항목에는 영향을 미치지 않습니다. 원하는 경우 다른 옵션이 필요합니다.
Miral

윈도우 & 'pbetkier'에 의해 위의 단계를 사용에서 근무하는 경우 잘 작동 힘내 배쉬 쉘 다음 번 시도
user593029

6

예, 전체 저장소를 다운로드하는 대신 폴더를 다운로드 할 수 있습니다. 모든 / 마지막 커밋

이렇게하는 좋은 방법

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
  1. -r HEAD는 마지막 개정 만 다운로드하며 모든 기록을 무시합니다.

  2. 트렁크 및 / 특정 폴더 참고

전후에 URL을 복사하고 변경하십시오 /trunk/. 이것이 누군가를 도울 수 있기를 바랍니다. 즐겨 :)

2019 년 9 월 26 일에 업데이트 됨


svn에서 오거나 svn을 사용하는 사용자에게만 해당됩니다. 이것을지지하지 않습니다.
C Johnson

@CJohnson 당신이 볼 수 있듯이 git repo 폴더를 복제하고 있습니다. 잘 작동
Qamar

1
이것은 git이 기본적으로 제공하는 것이 아니라 Git 허브 가 일반 Git 오퍼링과 인접하여 제공하는 것입니다. 그러나 그것을 사용할 수있을 때 아름답게 작동합니다. 감사!
Qix-MONICA가 MISTREATED

1
SO에 대한 무수한 제안 중에서 가장 간결하고 명확한 솔루션입니다.
boardrider

4

git 2.9 (2016 년 6 월)는 --no-checkout옵션을 일반화합니다 git worktree add( 하나의 리포지토리에 대해 여러 작업 트리에서 작업 할 수있는 명령 )

Ray Zhang ( )의 commit ef2a0ac (2016 년 3 월 29 일)를 참조하십시오 . 도움 : Eric Sunshine ( )Junio ​​C Hamano ( ) . (의해 병합 Junio C 하마노 - -커밋 0d8683c 13 사월 2016)OneRaynyDay
sunshinecogitster
gitster

git worktree맨 페이지는 이제 포함 :

--[no-]checkout:

기본적으로, add체크 아웃 <branch>하지만, --no-checkout사용자 지정, 확인하기 위해 결제 억제에 사용될 수있는 그러한 스파 스 체크 아웃 등을 구성 .


4

특정 폴더 만 체크 아웃하는 단계 :

1) git clone --no-checkout  <project clone url>  
2) cd <project folder>
3) git config core.sparsecheckout true   [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
    [You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]

참고로 첫 번째 단계에서는 --no-checkout을 사용할 필요가 없습니다. 전체 저장소를 복제 한 다음 아래 2-5 단계 (위에서 언급 한)를 모두 실행하면 원하는 결과를 얻을 수 있습니다. 당신이 그것을 얻지 못한 경우 알려주십시오.
SANDEEP MACHIRAJU

4

을 바탕으로 이 대답 하여 apenwarr이 댓글밀알 I 복제 할 때 디스크 공간이 나에게 거의 94 %를 저장 한 다음 솔루션을 내놓았다 리눅스 자식 저장소 로컬 하나 개의 문서 하위 디렉토리를 원하는 반면 :

$ cd linux
$ du -sh .git .
2.1G    .git
894M    .
$ du -sh 
2.9G    .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
 * branch              master     -> FETCH_HEAD
 * [new branch]        master     -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May  3 14:12 Documentation/
$  du -sh .git .
181M    .git
100K    .
$  du -sh
182M    .

그래서 나는 2.9GB에서 182MB로 내려갔습니다.

누락 된 파일이 모두 제거 된 파일로 색인에 추가 되었으므로이 작업을 수행하지 못했습니다 git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test( 여기 참조 ). 사람이하는 것과 알고 그래서 경우 git clone --filter=blob:none를 들어 git fetch, 우리는 아마 좀 더 메가 바이트를 저장할 수 있습니다. (man 페이지를 git-rev-list읽으면와 같은 것이 있음을 암시 --filter=sparse:path=…하지만 그중 하나도 작동하지 않습니다.

(모두 Debian Buster의 git 2.20.1로 시도했습니다.)


1
재미있는 피드백. 공감. 내가 모르는 --filter=sparse:path=…중 하나.
VonC

3

git을 처음 사용하지만 각 디렉토리에 대해 git checkout을 수행하면 작동하는 것 같습니다. 또한 스파 스 체크 아웃 파일에는 표시된대로 모든 디렉토리 뒤에 슬래시가 있어야합니다. 더 많은 경험이 있으면 이것이 작동하는지 확인하십시오.

흥미롭게도 스파 스 체크 아웃 파일에없는 디렉토리를 체크 아웃하면 아무런 차이가없는 것 같습니다. 그것들은 git 상태로 나타나지 않으며 git read-tree -m -u HEAD는 그것을 제거하지 않습니다. git reset --hard는 디렉토리를 제거하지 않습니다. 더 많은 경험이있는 사람이 체크 아웃되었지만 스파 스 체크 아웃 파일에없는 디렉토리에 대해 git이 생각하는 것에 대해 언급하고 싶습니까?


0

필자의 경우 Pods프로젝트를 복제 할 때 폴더 를 건너 뛰고 싶습니다 . 나는 아래처럼 단계별로 수행했고 그것은 나를 위해 작동합니다. 도움이 되길 바랍니다.

mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true 
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master

메모, 더 많은 폴더를 건너 뛰려면 스파 스 체크 아웃 파일에 더 많은 줄을 추가하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.