source

저장소 전체를 먼저 체크아웃하지 않고 스파스 체크아웃이 가능합니까?

ittop 2023. 7. 1. 09:58
반응형

저장소 전체를 먼저 체크아웃하지 않고 스파스 체크아웃이 가능합니까?

체크아웃하는 데 몇 시간이 걸리는 매우 많은 파일이 있는 저장소에서 작업하고 있습니다.저는 Git가 희소 체크아웃을 지원하기 때문에 Git가 이러한 저장소에서 잘 작동할지 여부를 조사하고 있지만, 제가 찾을 수 있는 모든 예제는 다음과 같습니다.

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

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

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

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

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

와 함께-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

이제 경로/inside_repo/to/desired_subdir(및 해당 경로)의 파일만 있는 "잘린" 체크아웃이 있음을 알게 됩니다.

Windows 명령줄에서는 경로를 따옴표로 묶어서는 안 됩니다. 즉, 다음 명령으로 6번째 명령을 변경해야 합니다.

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

그렇지 않으면 sparse-slot 파일에서 인용문을 얻을 것이고, 작동하지 않을 것입니다.

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
git checkout # or git switch

Git 버전 2.25를 설치해야 합니다.여기서 자세히 읽어보세요: https://github.blog/2020-01-17-monore po-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

git v2.37.1+에서 작동합니다.

git clone --filter=blob:none --no-checkout --depth 1 --sparse <project-url>
cd <project>

복제할 폴더 지정

git sparse-checkout add <folder1> <folder2>
git checkout

clone 에이있션습다)이 있습니다.--no-checkout또는-n은 당신이 당신이 원하는 것을 해줍니다.

명령 목록에서 다음을 변경합니다.

git clone <path>

대상:

git clone --no-checkout <path>

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

태그에 대한 커밋만 체크아웃하고 디렉터리를 잘라내는 것을 제외하고는 유사한 사용 사례가 있었습니다.용사를 합니다.--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>

이전에 파베크에 게시된 원라이너(감사합니다!)에서 찾고 있던 답을 발견했기 때문에 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단계에서 경로 끝에 후행 슬래시 "/"가 있다는 것입니다.

업데이트된 답변 2020:

이제 Git 2.25(2020년 1분기)와 함께 자세히 제시하는 명령이 있습니다.

니코노대답은 그 사용법을 보여줍니다.

git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

Git 2.27과 함께 발전했으며 여기처럼 희박한 체크아웃을 "재응용"하는 방법을 알고 있습니다.
Git 2.28에서는 당신이 희박하게 체크아웃된 저장소에 있다고 언급할 것입니다.


참고/경고:비콘 모드에서 유효한 특정 희소 체크아웃 패턴은 원뿔 모드에서 세그먼트 결함으로 이어졌으며, 이는 Git 2.35(Q1 2022)로 수정되었습니다.

커밋 a3eca58, 커밋 391c3a1, 커밋 a481d43(2021년 12월 16일) 참조.derrickstolee
(주니오 C 하마노에 의해 합병 -- -- 커밋 09481fe, 2022년 1월 10일)

sparse-checkout나쁜 패턴을 더하는 것을 거부하는

리뷰 담당자: 엘리야 뉴렌
사인 오프 바이: 데릭 스톨리

콘 모드 sparse-checkout에서 기존의 sparse-checkout 파일이 콘 모드 패턴과 일치하지 않을 경우 " add..."가 어떻게 git sparse-checkout(man)동작해야 하는지 불분명합니다.
기존 패턴에 대한 오류 메시지와 함께 실패하도록 동작을 변경합니다.

콘 패턴은' 한모콘로패은턴 '로 합니다./문자를 추가하십시오.
이는 '콘 모드: 잘못된 패턴에 대한 경고' 예제 테스트에 필요하지만, 콘 모드 패턴 인식과 관련된 경고를 테스트하는 데 사용하는 예제 희소 체크아웃 파일을 수정해야 합니다.

이 오류 검사는 비원형 모드 패턴을 정리하지 않고 추가하는 테스트로 인해 테스트 스크립트에서 더 아래쪽으로 오류가 발생합니다.
지금 테스트의 일부로 정리를 수행합니다.


Git 2.36 (Q2 2022)을 사용하여 git sparse-checkout(man)"는 작업 트리별 구성으로 작업하기를 원하지만 맨 저장소에 연결된 작업 트리에서 제대로 작동하지 않았습니다.

커밋 3ce1138, 커밋 5225591, 커밋 7316dc5, 커밋 fe18733, 커밋 615a84a, 커밋 5c11c0d(2022년 2월 7일)를 Derrick Stolee()derrickstolee의 커밋을 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 2022년 2월 25일 커밋 6249ce2에서)

worktree추가 시 sparse-patch 패턴 및 구성 복사

사인 오프 바이: 데릭 스톨리
리뷰 담당자: 엘리야 뉴렌

새 작업 트리를 추가할 때 해당 새 작업 트리에 대해 현재의 스파스 체크아웃 설정 세트를 사용할 것으로 예상하는 것이 타당합니다.
이는 작업 트리가 너무 커서 사용할 수 없는 리포지토리의 경우 특히 중요합니다.
부분 복제를 사용하는 경우에도 새 작업 트리에 기록되지 않아야 하는 파일에 대한 누락된 블롭을 다운로드하지 않도록 해야 하므로 이 점이 더욱 중요합니다.

전체 작업 트리를 확장하는 중간 단계 없이 이러한 작업 트리를 만드는 유일한 방법은 ' ' git worktree add(man)중에 희소 체크아웃 패턴과 구성 설정을 복사하는 것입니다.
각 작업 트리에는 고유한 희소 체크아웃 패턴이 있으며, 희소 체크아웃 파일이 없을 때 기본 동작은 HEAD의 모든 경로를 포함하는 것입니다.
따라서, 우리는 어딘가에서 패턴을 가져야 합니다. 그것들은 현재 작업 트리의 패턴일 수도 있습니다.
그런 다음 나중에 개별적으로 수정됩니다.

파일 존재하는 경우 합니다. sparse-checkout 파일은 다음과 같습니다.
이렇게 하면 새 작업 트리가 현재 작업 트리와 동일하게 동작하도록 중요한 설정에 복사됩니다.
우리가 계속해서 해야 할 유일한 예외는core.bare그리고.core.worktree작업 트리의 구성 파일에서 설정을 해제해야 합니다.


원답: 2016년

2는 git 2.9 (2016년 6월)를 할 것입니다.--no-checkout에 대한 선택권.git worktree add(하나의 repo에 대해 여러 작업 트리와 함께 작업할 수 있는 명령)

Ray OneRaynyDayZhang()의 commit ef2a0ac(2016년 3월 29일)을 참조하십시오.
Help-by: 에릭 sunshineco선샤인()과 주니오 차마노().gitster
(주니오 C 하마노에 의해 합병되었습니다 -- -- 2016년 4월 13일 커밋 0d8683c에서)

이제 man 페이지에는 다음이 포함됩니다.

--[no-]checkout:

기적으로본,add<branch> 지만하,,--no-checkoutsparse-patch 구성과 같은 사용자 지정을 위해 체크아웃을 억제하는 데 사용할 수 있습니다.

슬프게도 위의 것들 중 어느 것도 나에게 효과가 없었기 때문에 나는 매우 오랜 시간을 다른 조합의sparse-checkoutjava.

제 경우에는 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 --'을 실행합니다.


은 작하기위중것다것니습추이었는가하은동요해한을 추가하는 것이었습니다./*폴더 이름 뒤에 있습니다.

나는 1.9를 가지고 있습니다.

Penwar답변Miral의견바탕으로 다음 솔루션을 생각해 냈습니다. 이 솔루션을 통해 Linux Git 저장소를 로컬로 복제할 때 Documentation 하위 디렉터리를 하나만 사용하면 Disk 공간을 거의 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.9에서 내려갔습니다.GB에서 182MB로 이미 꽤 괜찮은 편입니다.

이 일을 할 수 없을 줄 알았는데요git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test누락된 파일이 모두 제거된 파일로 인덱스에 추가되었습니다.그래서 만약 누군가가 그것과 동등한 것을 안다면.git clone --filter=blob:none위해서git fetch몇 를 더 할 수 있을 (맨는 우는아마더맨트를절다것니입수있을약할읽기리지이페이.git-rev-list또한 다음과 같은 것이 있다는 것을 암시합니다.--filter=sparse:path=…하지만 그것도 제대로 작동하지 않았습니다.

(모두 데비안 버스터의 깃 2.20.1로 시도했습니다.)

예, 전체 리포지토리를 다운로드하는 대신 폴더를 다운로드할 수 있습니다.심지어 모든/마지막 커밋

이것을 하는 좋은 방법

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

  2. 트렁크 및 /특정 폴더 메모

URL 전후 URL 복사 및 /trunk/이것이 누군가에게 도움이 되기를 바랍니다.즐기세요 :)

2019년 9월 26일 업데이트됨

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

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]

git 2.27에서는 git sparse 체크아웃이 진화한 것처럼 보입니다.답변의 솔루션은 동일한 방식으로 작동하지 않습니다(git 2.25와 비교).

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 clone --sparse <URL> <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout add apps/my_app
git sparse-checkout add libs/my_lib

참고 항목: git-clone --sparsegit-sparse-checkout 추가

처음 보는 물건인데 디렉토리별로 체크아웃을 하면 되는 것 같습니다.또한 sparse-checkout 파일은 그림과 같이 모든 디렉터리 뒤에 슬래시가 있어야 합니다.경험이 많은 분이 이것이 효과가 있는지 확인해 주시기 바랍니다.

흥미롭게도 스파스 체크아웃 파일에 없는 디렉터리를 체크아웃해도 아무런 차이가 없는 것 같습니다.git 상태가 표시되지 않고 git read-tree-m-u HEAD로 인해 git이 제거되지 않습니다.git reset --hard를 사용해도 디렉터리가 제거되지 않습니다.체크아웃되었지만 희박한 체크아웃 파일에 없는 디렉터리에 대해 Git이 어떻게 생각하는지에 대해 언급할 경험이 있는 사람이 있습니까?

제 경우에는, 저는 건너뛰고 싶습니다.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

메모, 폴더를 더 건너뛰려면 스파스 체크아웃 파일에 줄을 더 추가하면 됩니다.

이것은 TypeScript 정의 라이브러리 @types에서 가져왔습니다.

레포의 구조는 다음과 같습니다.

types/
|_ identity/
|_ etc...

목표:ID/폴더만 체크아웃합니다.하위 폴더를 포함한 모든 내용이 포함됩니다.

⚠️ 이를 위해서는 대부분의 컴퓨터에서 기본값보다 최신 버전인 최소 Git 버전 2.27.0이 필요합니다.이전 버전에서는 더 복잡한 절차를 사용할 수 있지만 이 안내서에서는 다루지 않습니다.

git clone --sparse --filter=blob:none --depth=1 <source-repo-url>
git sparse-checkout add types/identity types/identity ...

그러면 유형/ID 폴더가 로컬 컴퓨터에 체크아웃됩니다.

--sparse작업 디렉터리가 저장소 루트의 파일로만 시작되도록 스파스-스캐너 파일을 초기화합니다.

--filter=blob:none파일을 제외하고 필요한 경우에만 가져옵니다.

--depth=1커밋 기록을 줄여 복제 속도를 더욱 향상시키지만 여기에 요약된 문제가 발생할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4114887/is-it-possible-to-do-a-sparse-checkout-without-checking-out-the-whole-repository

반응형