slackbuild 모음을 찾았습니다. 필요한 일부는 GitHub에 있습니다. https://github.com/PhantomX/slackbuilds/ 모든 자식을 가져오고 싶지 않습니다.
git clone https://github.com/PhantomX/slackbuilds.git
그러나 이것 에 대한 slackbuild 만 가져옵니다.
이 작업을 수행하는 방법? 가능합니까?
댓글
- stackoverflow.com/a/13738951/2072269
답변
전체 기록을 다운로드하게되므로 이점은별로 보이지 않지만 “희소”체크 아웃을 사용하여 특정 부품을 체크 아웃 할 수 있습니다. 이 스택 오버플로 게시물 인용 :
스파 스를 수행하는 단계 clone 은 다음과 같습니다.
mkdir <repo> cd <repo> git init git remote add -f origin <url>
이렇게하면 리모컨으로 빈 저장소가 생성되고 모든 개체를 가져 오지만 체크 아웃하지는 않습니다. 수행 :
git config core.sparseCheckout true
이제 실제로 체크 아웃 할 파일 / 폴더를 정의해야합니다. , 예 :
echo "some/dir/" >> .git/info/sparse-checkout echo "another/sub/tree" >> .git/info/sparse-checkout
마지막으로 중요한 것은 리모컨의 상태로 빈 저장소를 업데이트합니다.
git pull origin master
확장 된 자습서 이며 공식 스파 스 체크 아웃 문서 를 읽어야합니다.
얕은 클론 도 사용하는 것이 좋습니다. git pull
명령이 이전에 제공되었습니다.
git pull --depth=1 origin master
댓글
-
core.sparseCheckout
및.git/info/sparse-checkout
를 수정 한 후 git pull을 수행 한 후error: Sparse checkout leaves no entry on working directory
가 표시됩니다. div> - 수정 :
git init; git remote ...
설정 만하면 아무것도 다운로드되지 않습니다. 스파 스의 요점은 관심있는 개체 만 가져 오는 것입니다. - @vonbrand that '는
-f
옵션 : " -f 옵션 사용, git fetch < name > 원격 정보가 설정된 직후에 실행됩니다. " -
git remote add -f origin <url>
이후 git은 여전히 전체 저장소를 다운로드합니다. . 제 경우에는 ' 전체 저장소를 체크 아웃하지 않더라도 ' 시간을 낭비하고 싶지 않습니다. ' / li> - 스파 스 체크 아웃에서 체크 아웃 할 항목을 정의하지만 몇 개의 디렉토리를 제외하고 나머지는 체크 아웃하는 방법이 있습니까?
답변
git clone --filter
가 이제 GitHub에서 작동합니다 (2020 년 9 월 테스트 됨). -18, git 2.25.1)
이 옵션은 원격 프로토콜에 대한 업데이트와 함께 추가되었으며 실제로 개체가 서버.
예 :이 저장소의 d1
에 필요한 개체 만 복제하려면 : https://github.com/cirosantilli/test-git-partial-clone 할 수있는 작업 :
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
복제 명령은 다음 항목 만 가져옵니다.
그런 다음 checkout
명령은 서버에서 누락 된 blob (파일) 만 가져옵니다.
-
d1/a
-
d1/b
더욱 좋게, 나중에 GitHub에서 지원을 시작할 가능성이 높습니다.
--filter=blob:none \ --filter=tree:0 \
여기서 Git 2.20의 --filter=tree:0
는 불필요한 clone
모든 트리 개체를 가져 와서 checkout
로 연기되도록합니다. 하지만 내 2020-09-18 테스트에서 다음과 같이 실패했습니다.
fatal: invalid filter-spec "combine:blob:none+tree:0"
아마 --filter=combine:
복합 필터 ( Git 2.24에 추가되었으며 여러 --filter
에 의해 암시 됨)은 아직 구현되지 않았습니다.
에 언급 된대로 다음을 사용하여 가져온 개체를 관찰했습니다.
git verify-pack -v .git/objects/pack/*.pack
https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 각 개체가 정확히 무엇인지 명확하게 표시하지는 않지만 각 개체의 유형을 알려줍니다 (commit
, tree
, blob
), 최소 저장소에 개체가 너무 적기 때문에 각 항목을 명확하게 추론 할 수 있습니다. 개체입니다.
git rev-list --objects --all
는 트리 / 블럽 경로로 더 명확한 출력을 생성했지만 안타깝게도 실행할 때 일부 개체를 가져 와서 결정하기가 어렵습니다. 무엇을 가져 왔는지, 누구에게 더 나은 명령이 있는지 알려주세요.
TODO GitHub에서 언제 지원을 시작했는지 알려주는 발표를 찾아보세요. 2020-01-17의 https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ 에서 이미 --filter blob:none
를 언급했습니다.
git sparse-checkout
I 이 명령은 "이 하위 트리 만 신경 쓰고 "라는 설정 파일을 관리하기위한 것이라고 생각합니다. 하위 트리. 그러나 현재 문서가 약간 희박하기 때문에 확신하기가 조금 어렵습니다.;-)
그 자체로 얼룩 가져 오기를 막지는 않습니다.
이 이해가 맞다면 부분 복제 된 저장소에서 git 작업을 수행하려는 경우 의도하지 않게 더 많은 객체를 가져 오는 것을 방지 할 수 있으므로 위에서 설명한 git clone --filter
를 보완하는 것이 좋습니다. .
Git 2.25.1에서 시도했을 때 :
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
실제로 모든 개체를 가져 왔습니다.
그러나 Git 2.28에서는 원하는대로 개체를 가져 오지 않았습니다. 하지만 그렇게하면 :
git sparse-checkout set d1
d1
는 명시 적으로 명시되어 있지만 가져 와서 체크 아웃하지 않습니다. 해야합니다 : https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones 면책 조항 포함 :
부분 복제 기능이 일반 공급 될 수 있는지 확인하세요 [1].
[1] : GitHub는이 기능이 활성화되어있는 동안 내부적으로 여전히 평가 중입니다. 일부 저장소 (이 게시물에 사용 된 예제 포함)에서. 기능이 안정화되고 성숙 해짐에 따라 진행 상황을 계속 알려 드리겠습니다.
그래, 확실하기가 너무 어렵습니다. 순간, 부분적으로는 GitHub가 비공개 소스라는 기쁨에 감사드립니다.하지만 계속 주시하겠습니다.
명령 분석
서버는 다음과 같이 구성되어야합니다.
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
명령 분석 :
-
--filter=blob:none
는 모든 blob을 건너 뛰지 만 여전히 모든 트리 개체
를 가져옵니다. li>
-
--filter=tree:0
는 불필요한 트리를 건너 뜁니다. https://www.spinics.net/lists/git/msg342006.html
-
--depth 1
는 이미 --single-branch
를 의미합니다. 참조 : https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git
-
file://$(path)
은 git clone
프로토콜 허위를 극복하는 데 필요합니다. https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path
-
--filter=combine:FILTER1+FILTER2
는 여러 필터를 사용하는 구문입니다. 한 번, 어떤 이유로 --filter
를 전달하려고하면 다음과 같은 오류가 발생합니다. " 여러 필터 사양을 결합 할 수 없음 ". 이것은 Git 2.24에서 e987df5fe62b8b29be4cdcdeb3704681ada2b29e " list-objects-filter : 구현 복합 필터 구현 "
편집 : Git 2.28에서 실험적으로 --filter=FILTER1 --filter FILTER2
도 동일한 효과를 나타냅니다. GitHub는 아직 2020 년 9 월 현재 combine:
를 구현하지 않기 때문입니다. 18 및 fatal: invalid filter-spec "combine:blob:none+tree:0"
를 불평합니다. TODO는 어떤 버전에 도입 되었습니까?
--filter
의 형식은 man git-rev-list
.
Git 트리의 문서 :
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
로컬 테스트
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Git v2.19.0의 출력 :
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
결론 : 가 누락되었습니다. 예 :0975df9b39e23c15f63db194df7f45c76528bccb
(d2/b
는 d1/a
를 확인한 후 없습니다.
)
root/root
및 mybranch/mybranch
도 누락되었지만 --depth 1
는 누락 된 파일 목록. --depth 1
를 제거하면 누락 된 파일 목록에 표시됩니다.
꿈이 있습니다
이 기능은 Git에 혁명을 일으킬 수 있습니다.
기업의 모든 코드 기반을 가지고 있다고 상상해보십시오. repo
와 같은보기 흉한 타사 도구없이 div> 단일 저장소 에서
추악한 타사 확장 프로그램없이 저장소에 직접 거대한 Blob을 저장한다고 상상해보세요 .
GitHub에서 파일 / 디렉토리 메타 데이터 당 단일 저장소에 모든 개인 정보를 저장할 수 있습니다.
하위 모듈은 일반 디렉토리와 똑같이 취급되었습니다 : 트리 SHA를 요청하면 DNS와 유사한 메커니즘이 요청을 해결 합니다. 먼저 로컬 ~/.git
그런 다음 먼저 더 가까운 서버 (기업의 미러 / 캐시)로 이동하여 GitHub로 끝납니다.
답변
시도 :
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
댓글
- 가장 간단한 방법입니다. 모든 저장소를 다운로드하지는 않습니다.
/trunk
를 추가하고 /tree/master
를 제거해야합니다. 더 많은 여기
- 감사합니다! 저장소의 모든 폴더가 아니라 저장소의 폴더를 복제하고 싶습니다. 그리고 이것은 정말 저에게 효과적입니다.
답변
작업 솔루션 :
당신 압축을 해제해야합니다.
git config --global core.compression 0
그런 다음 얕은 클론을 사용해야합니다.
git clone --depth=1 <url>
그런 다음 가장 중요한 단계는 복제 된 프로젝트로 cd하는 것입니다.
cd <shallow cloned project dir>
이제 클론을 단계별로 엽니 다.
git fetch --depth=N, with increasing N
예 :
git fetch --depth=4
그런 다음
git fetch --depth=100
그런 다음
git fetch --depth=500
이 N을 대체하여 원하는 단계 수를 선택하고
마지막으로 나머지 버전을 모두 다운로드 할 수 있습니다. 사용,
git fetch --unshallow
도움이된다면 찬성 🙂
답변
위의 덕분에 마침내이 작업이 이루어졌습니다. 실수로 따옴표를 포함하여 오류가 발생하여 파일을 직접 편집했습니다. .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 파일에이 파일 만 있으면 작동하게되었습니다.
samples / react-script-editor
답변
이렇게하면 특정 폴더가 복제되고 관련없는 모든 기록이 제거됩니다.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
댓글
- 이렇게하면 모든 기록 (
--depth=1
) 및 기타 모든 디렉토리 (???
피하려면?).
Answer
GitHub 저장소의 경우 모든 하위 항목을 복제 할 수 있습니다. – https://github.com/HR/github-clone
댓글
을 사용하는 모든 GitHub 저장소 (모든 참조)의 디렉토리 h3>
- 슬프게도 이미지 빌드 중에 한 번만 사용하기 위해 Python 전체를 종속성으로 끌어 들이기 때문에 Dockerfile 시나리오에는 적합하지 않습니다.
답변
제가 직면 한 특정 제한 사항에 대해 답변하겠습니다.
- VSO에서 SSH는 보안에 의해 비활성화되어 git 아카이브를 사용할 수 없습니다. PAT / CredentialProvider 만 지원되었습니다.
- 우리 분기에는 엄청난 코드가 있으므로 git clone 최소 15 분이 소요됩니다.
내 작업은 다음과 같습니다.
- 일회성 수동 프로세스 : VSO UI에서 새로운 원격 분기는 파일이없는 “emptyBranch”라고 말합니다 (모두 삭제됨).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(매우 빠름)
-
git checkout <branchToSyncTo> <directoryToSyncTo>
(특정 폴더 만 체크 아웃)
git clone --filter
가 이제 GitHub에서 작동합니다 (2020 년 9 월 테스트 됨). -18, git 2.25.1)
이 옵션은 원격 프로토콜에 대한 업데이트와 함께 추가되었으며 실제로 개체가 서버.
예 :이 저장소의 d1
에 필요한 개체 만 복제하려면 : https://github.com/cirosantilli/test-git-partial-clone 할 수있는 작업 :
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git checkout master -- d1
복제 명령은 다음 항목 만 가져옵니다.
그런 다음 checkout
명령은 서버에서 누락 된 blob (파일) 만 가져옵니다.
-
d1/a
-
d1/b
더욱 좋게, 나중에 GitHub에서 지원을 시작할 가능성이 높습니다.
--filter=blob:none \ --filter=tree:0 \
여기서 Git 2.20의 --filter=tree:0
는 불필요한 clone
모든 트리 개체를 가져 와서 checkout
로 연기되도록합니다. 하지만 내 2020-09-18 테스트에서 다음과 같이 실패했습니다.
fatal: invalid filter-spec "combine:blob:none+tree:0"
아마 --filter=combine:
복합 필터 ( Git 2.24에 추가되었으며 여러 --filter
에 의해 암시 됨)은 아직 구현되지 않았습니다.
에 언급 된대로 다음을 사용하여 가져온 개체를 관찰했습니다.
git verify-pack -v .git/objects/pack/*.pack
https://stackoverflow.com/questions/7348698/git-how-to-list-all-objects-in-the-database/18793029#18793029 각 개체가 정확히 무엇인지 명확하게 표시하지는 않지만 각 개체의 유형을 알려줍니다 (commit
, tree
, blob
), 최소 저장소에 개체가 너무 적기 때문에 각 항목을 명확하게 추론 할 수 있습니다. 개체입니다.
git rev-list --objects --all
는 트리 / 블럽 경로로 더 명확한 출력을 생성했지만 안타깝게도 실행할 때 일부 개체를 가져 와서 결정하기가 어렵습니다. 무엇을 가져 왔는지, 누구에게 더 나은 명령이 있는지 알려주세요.
TODO GitHub에서 언제 지원을 시작했는지 알려주는 발표를 찾아보세요. 2020-01-17의 https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ 에서 이미 --filter blob:none
를 언급했습니다.
git sparse-checkout
I 이 명령은 "이 하위 트리 만 신경 쓰고 "라는 설정 파일을 관리하기위한 것이라고 생각합니다. 하위 트리. 그러나 현재 문서가 약간 희박하기 때문에 확신하기가 조금 어렵습니다.;-)
그 자체로 얼룩 가져 오기를 막지는 않습니다.
이 이해가 맞다면 부분 복제 된 저장소에서 git 작업을 수행하려는 경우 의도하지 않게 더 많은 객체를 가져 오는 것을 방지 할 수 있으므로 위에서 설명한 git clone --filter
를 보완하는 것이 좋습니다. .
Git 2.25.1에서 시도했을 때 :
git clone \ --depth 1 \ --filter=blob:none \ --no-checkout \ https://github.com/cirosantilli/test-git-partial-clone \ ; cd test-git-partial-clone git sparse-checkout init
실제로 모든 개체를 가져 왔습니다.
그러나 Git 2.28에서는 원하는대로 개체를 가져 오지 않았습니다. 하지만 그렇게하면 :
git sparse-checkout set d1
d1
는 명시 적으로 명시되어 있지만 가져 와서 체크 아웃하지 않습니다. 해야합니다 : https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/ # sparse-checkout-and-partial-clones 면책 조항 포함 :
부분 복제 기능이 일반 공급 될 수 있는지 확인하세요 [1].
[1] : GitHub는이 기능이 활성화되어있는 동안 내부적으로 여전히 평가 중입니다. 일부 저장소 (이 게시물에 사용 된 예제 포함)에서. 기능이 안정화되고 성숙 해짐에 따라 진행 상황을 계속 알려 드리겠습니다.
그래, 확실하기가 너무 어렵습니다. 순간, 부분적으로는 GitHub가 비공개 소스라는 기쁨에 감사드립니다.하지만 계속 주시하겠습니다.
명령 분석
서버는 다음과 같이 구성되어야합니다.
git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1
명령 분석 :
-
--filter=blob:none
는 모든 blob을 건너 뛰지 만 여전히 모든 트리 개체를 가져옵니다. li>
-
--filter=tree:0
는 불필요한 트리를 건너 뜁니다. https://www.spinics.net/lists/git/msg342006.html -
--depth 1
는 이미--single-branch
를 의미합니다. 참조 : https://stackoverflow.com/questions/1778088/how-to-clone-a-single-branch-in-git -
file://$(path)
은git clone
프로토콜 허위를 극복하는 데 필요합니다. https://stackoverflow.com/questions/47307578/how-to-shallow-clone-a-local-git-repository-with-a-relative-path -
--filter=combine:FILTER1+FILTER2
는 여러 필터를 사용하는 구문입니다. 한 번, 어떤 이유로--filter
를 전달하려고하면 다음과 같은 오류가 발생합니다. " 여러 필터 사양을 결합 할 수 없음 ". 이것은 Git 2.24에서 e987df5fe62b8b29be4cdcdeb3704681ada2b29e " list-objects-filter : 구현 복합 필터 구현 "편집 : Git 2.28에서 실험적으로
--filter=FILTER1 --filter FILTER2
도 동일한 효과를 나타냅니다. GitHub는 아직 2020 년 9 월 현재combine:
를 구현하지 않기 때문입니다. 18 및fatal: invalid filter-spec "combine:blob:none+tree:0"
를 불평합니다. TODO는 어떤 버전에 도입 되었습니까?
--filter
의 형식은 man git-rev-list
.
Git 트리의 문서 :
- https://github.com/git/git/blob/v2.19.0/Documentation/technical/partial-clone.txt
- https://github.com/git/git/blob/v2.19.0/Documentation/rev-list-options.txt#L720
- https://github.com/git/git/blob/v2.19.0/t/t5616-partial-clone.sh
로컬 테스트
#!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME="a" export GIT_COMMITTER_EMAIL="a" export GIT_AUTHOR_NAME="a" export GIT_AUTHOR_EMAIL="a" export GIT_COMMITTER_DATE="2000-01-01T00:00:00+0000" export GIT_AUTHOR_DATE="2000-01-01T00:00:00+0000" rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf "d1/a" > ./d1/a printf "d1/b" > ./d1/b printf "d2/a" > ./d2/a printf "d2/b" > ./d2/b # Present only in root. mkdir "root" printf "root" > ./root/root git add . git commit -m "root" --quiet # Second commit only on master. git rm --quiet -r ./root mkdir "master" printf "master" > ./master/master git add . git commit -m "master commit" --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir "mybranch" printf "mybranch" > ./mybranch/mybranch git add . git commit -m "mybranch commit" --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don"t checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing directory from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/ echo echo "# Missing objects after checking out d1" git rev-list --all --quiet --objects --missing=print
Git v2.19.0의 출력 :
# List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: "/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo" does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb
결론 : 가 누락되었습니다. 예 :0975df9b39e23c15f63db194df7f45c76528bccb
(d2/b
는 d1/a
를 확인한 후 없습니다.
)
root/root
및 mybranch/mybranch
도 누락되었지만 --depth 1
는 누락 된 파일 목록. --depth 1
를 제거하면 누락 된 파일 목록에 표시됩니다.
꿈이 있습니다
이 기능은 Git에 혁명을 일으킬 수 있습니다.
기업의 모든 코드 기반을 가지고 있다고 상상해보십시오. repo
와 같은보기 흉한 타사 도구없이 div> 단일 저장소 에서
추악한 타사 확장 프로그램없이 저장소에 직접 거대한 Blob을 저장한다고 상상해보세요 .
GitHub에서 파일 / 디렉토리 메타 데이터 당 단일 저장소에 모든 개인 정보를 저장할 수 있습니다.
하위 모듈은 일반 디렉토리와 똑같이 취급되었습니다 : 트리 SHA를 요청하면 DNS와 유사한 메커니즘이 요청을 해결 합니다. 먼저 로컬 ~/.git
그런 다음 먼저 더 가까운 서버 (기업의 미러 / 캐시)로 이동하여 GitHub로 끝납니다.
답변
시도 :
svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}
댓글
- 가장 간단한 방법입니다. 모든 저장소를 다운로드하지는 않습니다.
/trunk
를 추가하고/tree/master
를 제거해야합니다. 더 많은 여기 - 감사합니다! 저장소의 모든 폴더가 아니라 저장소의 폴더를 복제하고 싶습니다. 그리고 이것은 정말 저에게 효과적입니다.
답변
작업 솔루션 :
당신 압축을 해제해야합니다.
git config --global core.compression 0
그런 다음 얕은 클론을 사용해야합니다.
git clone --depth=1 <url>
그런 다음 가장 중요한 단계는 복제 된 프로젝트로 cd하는 것입니다.
cd <shallow cloned project dir>
이제 클론을 단계별로 엽니 다.
git fetch --depth=N, with increasing N
예 :
git fetch --depth=4
그런 다음
git fetch --depth=100
그런 다음
git fetch --depth=500
이 N을 대체하여 원하는 단계 수를 선택하고
마지막으로 나머지 버전을 모두 다운로드 할 수 있습니다. 사용,
git fetch --unshallow
도움이된다면 찬성 🙂
답변
위의 덕분에 마침내이 작업이 이루어졌습니다. 실수로 따옴표를 포함하여 오류가 발생하여 파일을 직접 편집했습니다. .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 파일에이 파일 만 있으면 작동하게되었습니다.
samples / react-script-editor
답변
이렇게하면 특정 폴더가 복제되고 관련없는 모든 기록이 제거됩니다.
git clone --single-branch -b {branch} [email protected]:{user}/{repo}.git git filter-branch --subdirectory-filter {path/to/folder} HEAD git remote remove origin git remote add origin [email protected]:{user}/{new-repo}.git git push -u origin master
댓글
- 이렇게하면 모든 기록 (
--depth=1
) 및 기타 모든 디렉토리 (???
피하려면?).
Answer
GitHub 저장소의 경우 모든 하위 항목을 복제 할 수 있습니다. – https://github.com/HR/github-clone
댓글
을 사용하는 모든 GitHub 저장소 (모든 참조)의 디렉토리 h3>
- 슬프게도 이미지 빌드 중에 한 번만 사용하기 위해 Python 전체를 종속성으로 끌어 들이기 때문에 Dockerfile 시나리오에는 적합하지 않습니다.
답변
제가 직면 한 특정 제한 사항에 대해 답변하겠습니다.
- VSO에서 SSH는 보안에 의해 비활성화되어 git 아카이브를 사용할 수 없습니다. PAT / CredentialProvider 만 지원되었습니다.
- 우리 분기에는 엄청난 코드가 있으므로 git clone 최소 15 분이 소요됩니다.
내 작업은 다음과 같습니다.
- 일회성 수동 프로세스 : VSO UI에서 새로운 원격 분기는 파일이없는 “emptyBranch”라고 말합니다 (모두 삭제됨).
-
git clone --depth=1 --single-branch --branch emptyBranch <remote>
(매우 빠름) -
git checkout <branchToSyncTo> <directoryToSyncTo>
(특정 폴더 만 체크 아웃)