programing

얕은 깃 서브모듈을 만드는 방법은?

batch 2023. 6. 25. 18:34
반응형

얕은 깃 서브모듈을 만드는 방법은?

얕은 서브모듈이 가능합니까?저는 여러 개의 서브모듈이 있는 슈퍼 프로젝트를 가지고 있습니다. 각각의 서브모듈은 긴 역사를 가지고 있기 때문에, 그 모든 역사를 끌고 가는 것은 불필요하게 커집니다.

내가 찾은 은 이 이 없는 실뿐입니다.

이것을 구현하기 위해 그냥 git-submodule을 해킹해야 합니까?

TLDR;

git clone --recurse-submodules --shallow-submodules

(그러나 Ciro Santillianswer와 함께 주의사항 참조)
또는: 하위 모듈이 얕은 클론이어야 한다는 것을 기록합니다.

git config -f .gitmodules submodule.<name>.shallow true

그 말은 다음을 의미합니다.git clone --recurse-submodules '서브제복얕니합다게을듈모''를 얕은 으로 만듭니다.<name>(깊이 1), 심지어 그것 없이도.--shallow-submodules.


▁입니다.git submodule/git clone얕은 클론의 경우 Git 1.8.4로 시작하여(2013년) 거기서 시작합니다.


곧 출시될 Git 1.8.4의 새로운 기능(2013년 7월:

"git submodule update선택적으로 하위 모듈 리포지토리를 얕게 복제할 수 있습니다.

2로 기록할 수 있습니다. (Andgit 2.10 2016년 3분기)git config -f .gitmodules submodule.<name>.shallow true.
답의 ).

커밋 275cd184d52b5b81cb89e4ec33e540fb2ae61c1f를 참조하십시오.

추가합니다.--depth" 및 command."git submodule"에 됩니다.이 기능은 서브모듈이 크고 최근 커밋 이외에는 관심이 없는 경우에 유용합니다.

테스트가 추가되고 "서브모듈 업데이트가 pwd의 심볼릭 링크를 처리할 수 있다"에서 테스트 파일의 나머지 부분을 준수하도록 일부 들여쓰기 조정이 이루어졌습니다.

사인 오프 바이: 프레드릭 구스타프손<iveqy@iveqy.com>
: 옌스레만큐이아.<Jens.Lehmann@web.de>

즉, 다음과 같이 작동합니다.

# add shallow submodule
git submodule add --depth 1 <repo-url> <path>
git config -f .gitmodules submodule.<path>.shallow true

# later unshallow
git config -f .gitmodules submodule.<path>.shallow false
git submodule update <path>

명령은 임의의 순서로 실행할 수 있습니다.git submodule명령은 실제 복제를 수행합니다(이번에는 깊이 1 사용). 리고그.git config명령을 사용하면 나중에 저장소를 반복적으로 복제할 다른 사용자가 이 옵션을 영구적으로 사용할 수 있습니다.

예를 들어, 레포가 있다고 가정합니다.https://github.com/foo/bar그리고 당신은 추가하고 싶습니다.https://github.com/lorem/ipsum 하위모로서서에보고에 .path/to/submodule명령은 다음과 같습니다.

git submodule add --depth 1 git@github.com:lorem/ipsum.git path/to/submodule
git config -f .gitmodules submodule.path/to/submodule.shallow true

다음은 같은 결과를 초래합니다(반대 순서).

git config -f .gitmodules submodule.path/to/submodule.shallow true
git submodule add --depth 1 git@github.com:lorem/ipsum.git path/to/submodule

가 다음번누가도때망갈가군에때▁the도▁someone▁runs를 실행할 때git clone --recursive git@github.com:foo/bar.git그것은 모든 역사를 끌어들일 것입니다.https://github.com/foo/bar예상대로 서브모듈을 얕게 복제할 뿐입니다.

포함:

--depth

이 옵션은 다음 기간에 유효합니다.add그리고.update명령을 실행합니다.
기록이 지정된 리비전 수만큼 잘린 '허름한' 복제본을 만듭니다.


Twyman댓글에 다음과 같이 덧붙입니다.

로는 이 은 추적하지할 수 .master바싹 붙어서깊이를 1로 설정하면,submodule update원하는 하위 모듈 커밋이 최신 마스터인 경우에만 성공할 수 있습니다.그렇지 않으면 ""를 fatal: reference is not a tree얻게 됩니다.

그것은 사실이에요.
즉, git 2.8(2016년 3월)까지입니다.하는 경우 2.8인치submodule update --depth원격 repo HEAD 중 하나에서 SHA1에 직접 연결할 수 있더라도 성공할 수 있는 기회가 한 번 더 있습니다.

스테판 벨러()stefanbeller의 커밋 fb43e31(2016년 2월 24일) 참조.
Help-by: 주니오 C 하마노().gitster
(주니오 C 하마노에 의해 합병 -- -- 9671a76, 2016년 2월 26일 커밋)

하위 모듈: sha1을 직접 가져와 필요한 sha1을 가져오도록 더 노력합니다.

Gerrit의 하위 모듈도 업데이트하는 변경 사항을 검토할 때 일반적인 검토 방법은 패치를 다운로드하여 로컬에서 선택하여 테스트하는 것입니다.
현지에서 할 때는' 러나로테때할는트스그서에컬때▁'▁''가 됩니다.git submodule update서브모듈의 해당 커밋이 아직 프로젝트 기록의 일부가 아니라 제안된 변경 사항일 뿐이므로 올바른 서브모듈 sha1을 가져오지 못할 수 있습니다.

기본 가져오기의 일부가 아닌 경우 직접 가져오기를 시도합니다.그러나 일부 서버는 sha1에 의한 직접 가져오기를 지원하지 않습니다. 이는 다음과 같습니다.git-fetch빨리 실패하는 것.
여전히 누락된 sha1은 어차피 나중에 체크아웃 단계에서 실패로 이어질 수 있기 때문에 여기서 실패하는 것이 최선입니다.


MVG댓글에서 fb43e31을 커밋해야 한다고 지적합니다(git 2.9, 2016년 2월).

제가 보기에 커밋 fb43e31은 SHA1 id의 누락된 커밋을 요청하는 것 같습니다.uploadpack.allowReachableSHA1InWant그리고.uploadpack.allowTipSHA1InWant서버의 설정이 작동 여부에 영향을 미칠 수 있습니다.
저는 오늘 깃 리스트에 글을 써서 얕은 서브모듈의 사용이 어떻게 하면 일부 시나리오, 즉 커밋도 태그일 경우에 더 잘 작동할 수 있는지 지적했습니다.
두고 보자꾸나중에.

이것이 fb43e31이 특정 SHA1에 대한 검색을 기본 브랜치에 대한 검색 후 폴백으로 만든 이유라고 생각합니다.
그럼에도 불구하고 "--depth 1"의 경우 조기 중단하는 것이 타당할 것 같습니다. 나열된 참조가 요청된 참조와 일치하지 않고 SHA1에서 요청하는 것이 서버에서 지원되지 않는다면 서브모듈 요구 사항을 어느 쪽이든 충족할 수 없기 때문에 아무것도 가져오는 것이 의미가 없습니다.


2016년 8월 업데이트(3년 후)

Git 2.10(2016년 3분기)을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

 git config -f .gitmodules submodule.<name>.shallow true

자세한 내용은 "추가 중량 없이 서브모듈 장착"을 참조하십시오.


Git 2.13(2017년 2분기)은 Sebastian Schuberth()sschuberth의 커밋 8d3047c(2017년 4월 19일)를 추가합니다.
(세바스찬 슈베르트에 의해 합병되었습니다 -- -- 2017년 4월 20일 커밋 8d3047c에서)

이 하위 모듈의 클론은 얕은 클론으로 수행됩니다(히스토리 깊이가 1)

그러나 Ciro Santilli코멘트(및 답변세부 사항)에 추가합니다.

shallow = true.gitmodules는 원격의 을 미칩니다. 이는 용사가 HEAD 추적 참는미 영칩 다니향을을 할 때 사용됩니다.--recurse-submodules목표 커밋이 지점을 가리킬지라도, 그리고 당신이 그것을 넣더라도.branch = mybranch에서..gitmodules뿐만 아니라.


2은 Git 2.20 (2018년 4월)은 BLOB에서 지원을 했습니다.AT에서 읽을 수 있도록 업데이트된 서브모듈 지원을 개선했습니다.HEAD:.gitmodules .gitmodules작업 트리에 파일이 없습니다.

커밋 2b1257e, 커밋 76e9bdc(2018년 10월 25일), 커밋 b5c259f, 커밋 23ddd8f5, 커밋 b2faad4, 커밋 2502fc, 커밋 996df4d, 커밋 d1b13df, 커밋 45f5ef3, 커밋 bc780(2018년 10월 5일)을 안토니오 오스파이트()ao2 참조.
(주니오 C 하마노에 의해 합병 -- -- commit abb4824, 2018년 11월 13일)

submodule.gitmodules 때 ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

때..gitmodules작업 트리에서 파일을 사용할 수 없습니다. 인덱스와 현재 분기의 내용을 사용해 보십시오.
여기에서는 파일이 리포지토리의 일부이지만 어떤 이유로 인해 체크아웃되지 않은 경우(예: 희박한 체크아웃)에 대해 설명합니다.

' 를통해를적도 ' 이있수니다습사할 '를 할 수 .git submodule를 읽는 명령gitmodules작업 트리를 완전히 채우지 않은 구성 파일입니다.

에게 편지 쓰기.gitmodules파일을 체크아웃해야 하므로 호출하기 전에 확인하십시오.config_set_in_gitmodules_file_gently.

다에도유 추가검사한에도 합니다.git-submodule.sh::cmd_add() "▁의▁""▁the▁to"의 인 실패를 하기 위해git submodule add 때의 명령.gitmodules수 . 할 수 있습니다( 모듈 되었지만 안전쓸수없다니습게하없e쓸다). 이렇게 하면 명령이 리포지토리를 스퓨리어스 상태로 두는 것을 방지할 수 있습니다(예: 하위 모듈 리포지토리가 복제됨)..gitmodules다음 이유로 업데이트되지 않았습니다.config_set_in_gitmodules_file_gently실패).

게다가 그 이후로config_from_gitmodules()이제 글로벌 개체 저장소에 액세스하므로 글로벌 개체 저장소에 대한 동시 액세스에 대해 함수를 호출하는 모든 코드 경로를 보호해야 합니다.
현재 이 문제는 다음과 같은 경우에만 발생합니다.builtin/grep.c::grep_submodules() ㅠㅠ라고 요.grep_read_lock()를 포함하는 코드를 호출하기 config_from_gitmodules().

:이하지 않는 : " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ".gitmodules그들의 작업 트리에서.


참고: Git 2.24(2019년 4분기)는 하위 모듈 얕은 곳을 복제할 때 발생할 수 있는 세그먼트 결함을 수정합니다.

Ali Utku Selen()auselen의 commit db3c85(2019년 9월 30일)를 참조하십시오.
(Junio C Hamano에 의해 합병됨 -- -- 커밋 678a9ca, 2019년 10월 9일)


2), Git 2.25 (2020년 1분기), Git 2.25 (2020년 1분기)를 명확히 합니다.git submodule update문서화

필립 블레인()의 phil-blain커밋 f0e58b3(2019년 11월 24일) 참조.
(Junio C Hamano에 의해 합병됨 -- -- 2019년 12월 5일 위원회 ef61045에서)

'git submodule update'doc가 누락된 커밋을 가져옵니다.

도우미: 하마노 주니오
도움을 받은 사람: 요하네스 쉰들린
사인 오프 바이: 필립 블레인

superproject에 기록된 SHA-1을 찾을 수 없는 경우 'update'가git submodule 하위 모듈 원격에서 새 커밋을 가져옵니다.이는 설명서에 언급되지 않았습니다.


: 2)와 "Git 2.25 (2020년 1분기) 간의 상호:git clone --recurse-submodules대체 객체 저장소가 잘못 설계되었습니다.

설명서와 코드는 사용자가 오류를 볼 때 보다 명확한 권장 사항을 제시하도록 학습되었습니다.

커밋 4f3e57e, 커밋 10c64a0(2019년 12월 2일)을 Jonathan jhowtanTan() 참조.
(주니오 C 하마노에 의해 합병 -- -- 커밋 5dd1d59, 2019년 12월 10일)

치명적인 대체 오류에 대해 submodule--helper조언합니다.

사인 오프 바이: 조나단 탄
어큐드바이: 제프 킹

에 이 있는 를 재귀적으로 할 때.gitmodules그리고 "와 함께 재결합합니다.--reference=<path>들어 다음예:

git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  master
git clone --recurse-submodules --branch=master -j8 \
  https://android.googlesource.com/platform/superproject \
  --reference master master2

실패 대상:

fatal: submodule '<snip>' cannot add alternate: reference repository
'<snip>' is shallow

슈퍼 프로젝트의 대안에서 계산된 대안을 추가할 수 없는 경우, 이 경우든 다른 경우든 "구성에 대해 조언하십시오.submodule.alternateErrorStrategy 및 사용 " 사용--reference-if-able 대에신▁""" --reference복제할 때.

자세한 내용은 다음과 같습니다.

Git 2.25 (2020년 1분기)에서는 "git clone --recurse-submodules"와 대체 객체 저장소 간의 상호 작용이 잘못 설계되었습니다.

서브모듈을 Doc설명합니다.대체 오류 전략

사인 오프 바이: 조나단 탄
어큐드바이: 제프 킹

커밋 31224cbdc7("clone재귀 및 참조 옵션은 하위 모듈 대체 트리거", 2016-08-17, Git v2.11.0-rc0 -- merge listed in batch #1) 슈퍼 프로젝트에서 구성 옵션 submodule.alternateErrorStrategy""submodule.alternateLocation 및 ""를 지원하도록 Git에게 가르쳤습니다.

만약 "submodule.alternateLocation"" ""로.superproject프로젝트에서 프 젝 로 트 프 젝 트 모 복 하 이 위 때 대 그 하 신 위 모 듈 에 은 대 계 산 그 경 합 니 대 유 다 를 로 한 것 체 한 사 다 마 의 그 듈 서 에 로 퍼 될 ▁path▁on▁subm▁▁from▁alternate▁it▁the슈project▁is,projectod퍼▁analogous ▁a▁instead▁that에서 해당 하위 모듈에 해당 서브$GIT_DIR/objects/info/alternates슈퍼 프로젝트의, 그리고 그것을 참조합니다.

"submodule.alternateErrorStrategy옵션은 해당 대체 항목을 참조할 수 없는 경우 발생하는 작업을 결정합니다.
그러나 해당 옵션이 "die"로 설정되지 않은 경우(31224cbdc7의 테스트에서 볼 수 있듯이) 대체 옵션이 지정되지 않은 것처럼 복제가 진행되는지는 분명하지 않습니다.
따라서 그에 따라 문서화합니다.

이제 구성 하위 모듈 설명서에는 다음이 포함됩니다.

submodule.alternateErrorStrategy::

통해 계산 서브된 듈에대 처오방 지정합다를 통해 에 대한 오류를 합니다.submodule.alternateLocation.
가능한 값은 다음과 같습니다.ignore,info,die.
기본값은 입니다.die.
다으로 설된경우로 되어 있는 하십시오.ignore또는info그리고 계산된 대체에 오류가 있으면 대체가 지정되지 않은 것처럼 복제가 진행됩니다.


참고:git submodule update --quiet(man) " "는 Git 2.32 (2021년 2분기)로 수정된 조용한 옵션을 기반으로 전파하지 않았습니다.

니콜라스 클라크()의 nwc10커밋 62af4bd(2021년 4월 30일)를 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- 74339f8, 2021년 5월 11일 커밋)

"submodule update와 함께 가져오기의 기본에 기초합니다.--quiet"

사인 오프 바이: 니콜라스 클라크

다음과 같은 명령어

$ git submodule update --quiet --init --depth=1

클론을 하여, 셸를 얕은클을포여셸부릅다고니함수라함하론▁the다라고 부릅니다.fetch_in_submodule,그것이 차례로 유발합니다.git fetch.
를 하세요.--quiet옵션은 거기에 있습니다.

Git 2.9.0은 하위 모듈인 얕은 클론을 직접 지원하므로 이제 다음과 같이 전화할 수 있습니다.

git clone url://to/source/repository --recursive --shallow-submodules

Ryan의 답변에 따라 저는 모든 서브모듈을 반복하고 얕은 클론을 생성하는 간단한 스크립트를 생각해 낼 수 있었습니다.

#!/bin/bash
git submodule init
for i in $(git submodule | sed -e 's/.* //'); do
    spath=$(git config -f .gitmodules --get submodule.$i.path)
    surl=$(git config -f .gitmodules --get submodule.$i.url)
    git clone --depth 1 $surl $spath
done
git submodule update

, git-submodule "source"처럼 .git submodule add이미 리포지토리가 있는 하위 모듈을 처리할 수 있습니다.그런 경우에는...

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
$ git submodule add $remotesub1 $sub1
#repeat as necessary...

하위 모듈 보고서에 필요한 커밋이 있는지 확인해야 하므로 적절한 깊이를 설정해야 합니다.

편집: 여러 개의 수동 하위 모듈 클론을 사용한 후 한 번의 업데이트를 수행할 수 있습니다.

$ git clone $remote1 $repo
$ cd $repo
$ git clone --depth 5 $remotesub1 $sub1
#repeat as necessary...
$ git submodule update

Git 2.14.1 기준 버그 / 예상치 못한 / 성가신 행동 요약

  1. shallow = true.gitmodules에만 영향을 미칩니다.git clone --recurse-submodulesHEAD 서브모듈은 대상 있는 을 가리키고 , 를 에도 도상 원 격 하 분 가 있 커 필 밋 가 을 리 킵 니 한 요 다 져 켜 경 우 라 대 로 리 기 더 커 이 밋 의 위branch = mybranch에서..gitmodules뿐만 아니라.

    로컬 테스트 스크립트.GitHub 2017-11에서 동일한 행동을 보입니다.HEAD는 기본 설정으로 됩니다.

    git clone --recurse-submodules https://github.com/cirosantilli/test-shallow-submodule-top-branch-shallow
    cd test-shallow-submodule-top-branch-shallow/mod
    git log
    # Multiple commits, not shallow.
    
  2. git clone --recurse-submodules --shallow-submodules표시된 합니다.error: Server does not allow request for unadvertised object.

    로컬 테스트 스크립트.GitHub에서 동일한 동작:

    git clone --recurse-submodules --shallow-submodules https://github.com/cirosantilli/test-shallow-submodule-top-sha
    # error
    

    저는 또한 메일링 리스트에 대해 물었습니다: https://marc.info/ ?l=git&m=151863590026582&w=2, 답변:

    이론적으로 이것은 쉬울 것입니다.:)

    불행히도, 실제로는 그렇게 많지 않습니다.복제는 분기의 최신 팁(일반적으로 마스터)만 얻을 수 있기 때문입니다.클론에는 원하는 정확한 sha1을 지정하는 메커니즘이 없습니다.

    와이어 프로토콜은 정확한 sha1s를 요청하는 것을 지원하므로 이를 포함해야 합니다. (Caveat: 서버 운영자가 업로드 팩을 활성화하는 경우에만 작동합니다.)도달 가능 허용SHA1AFICT가 없는 Github을 원하는 경우)

    git-module을 사용하면 임의의 sha1을 가져올 수 있으므로 해결 방법으로 "git submodule update"를 사용하여 재귀 클론 이후에 가져오기를 실행할 수 있습니다.

TODO 테스트: .

서브모듈의 표준 위치가 원격입니까?그렇다면 한 번 복제해도 괜찮습니까?즉, 빈번한 서브모듈(re) 클론의 대역폭 낭비로 인해 얕은 클론을 원하십니까?

얕은 클론을 사용하여 로컬 디스크 공간을 절약하려면 Ryan Graham의 답변이 좋은 방법인 것 같습니다.저장소가 얕도록 수동으로 복제합니다.될 것 .git submodule그것을 지지하기 위해.목록에 대해 묻는 전자 메일을 보냅니다(실행에 대한 조언, 인터페이스에 대한 제안 등).제 생각에, 그곳에 있는 사람들은 건설적인 방법으로 깃을 향상시키기를 간절히 원하는 잠재적인 기여자들을 꽤 지지합니다.

모듈의 (합니다),--reference.git submodule update 1) 예: make (Git 1.6.4 있음예에이참상로다니조합를소장저컬체객). make: make:--mirror 모듈을 사용한 , " " " " 를 사용합니다.--reference이러한 로컬 클론을 가리키는 하위 모듈).에 대해 꼭 읽어보세요.git clone --reference/git clone --shared사하기전에를 사용하기 --reference참조 미러에서 발생할 수 있는 유일한 문제는 신속하게 전달되지 않는 업데이트를 가져오는 것입니다(문제를 일으킬 수 있는 포기된 커밋을 유지하기 위해 리플로그를 활성화하고 만료 창을 확장할 수는 있지만).당신은 문제가 없어야 합니다.

  • 로컬 하위 모듈 커밋을 수행하지 않는 경우
  • 표준 리포지토리가 게시할 수 있는 비고속 프로토콜에 의해 매달려 있는 커밋은 로컬 하위 모듈 커밋의 조상이 아닙니다.
  • 표준 하위 모듈 저장소에 게시될 수 있는 비고속 모듈을 기반으로 로컬 하위 모듈 커밋을 유지합니다.

만약 당신이 이와 같은 것을 하고 당신의 작업 트리에 로컬 서브모듈 커밋을 가지고 있을 가능성이 있다면, 체크아웃된 서브모듈에 의해 참조되는 중요한 객체들이 미러 저장소에 매달려 있지 않도록 하는 자동화된 시스템을 만드는 것이 좋을 것입니다.필요한 저장소로 복사).

그리고, 예를 들면.git clone manpage를 .--reference이러한 의미를 이해하지 못하는 경우.

# Full clone (mirror), done once.
git clone --mirror $sub1_url $path_to_mirrors/$sub1_name.git
git clone --mirror $sub2_url $path_to_mirrors/$sub2_name.git

# Reference the full clones any time you initialize a submodule
git clone $super_url super
cd super
git submodule update --init --reference $path_to_mirrors/$sub1_name.git $sub1_path_in_super
git submodule update --init --reference $path_to_mirrors/$sub2_name.git $sub2_path_in_super

# To avoid extra packs in each of the superprojects' submodules,
#   update the mirror clones before any pull/merge in super-projects.
for p in $path_to_mirrors/*.git; do GIT_DIR="$p" git fetch; done

cd super
git pull             # merges in new versions of submodules
git submodule update # update sub refs, checkout new versions,
                     #   but no download since they reference the updated mirrors

신에대 --reference은 미클 론기 하드 링크 기러수 있사다니의 기본 할 수 .git clone로컬 미러를 서브모듈의 소스로 사용합니다.에서는 새로운슈클는서론에트프젝로퍼▁do는▁in서클,를 수행합니다.git submodule init「 」의 합니다..git/config 거울, 거울을 가리킵니다.git submodule update하드 링크를 얻으려면 체크아웃된 기존 하위 모듈을 다시 복제해야 합니다.미러에 한 번만 다운로드한 다음 이러한 미러에서 체크아웃된 하위 모듈로 로컬로 가져오는 방식으로 대역폭을 절약할 수 있습니다.하드 링크를 사용하면 디스크 공간을 절약할 수 있습니다(체크아웃된 하위 모듈의 개체 저장소의 여러 인스턴스에 걸쳐 페치가 누적되고 복제되는 경향이 있지만, 하드 링크를 통해 제공되는 디스크 공간 절약을 위해 정기적으로 미러에서 체크아웃된 하위 모듈을 다시 복제할 수 있습니다).

특정 리비전/변경 세트를 사용하여 git 저장소를 복제하는 방법에 대한 참조

당신의 서브모듈 참조가 마스터와 떨어져 있어도 문제가 없는 간단한 스크립트를 작성했습니다.

git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'

이 문은 참조된 하위 모듈 버전을 가져옵니다.

속도는 빠르지만 서브모듈에서 편집을 커밋할 수 없습니다. https://stackoverflow.com/a/17937889/3156509) 전에 편집을 취소해야 합니다.

전체:

#!/bin/bash
git submodule init
git submodule foreach --recursive 'git rev-parse HEAD | xargs -I {} git fetch origin {} && git reset --hard FETCH_HEAD'
git submodule update --recursive

저는 약간 다른 버전을 만들었습니다. 모든 프로젝트가 실행되는 것은 아닙니다.표준 서브모듈 추가가 작동하지 않았고 위 스크립트도 작동하지 않았습니다.그래서 저는 태그 ref에 대한 해시 룩업을 추가했고, 만약 그것이 없다면, 그것은 완전한 클론으로 되돌아갑니다.

#!/bin/bash
git submodule init
git submodule | while read hash name junk; do
    spath=$(git config -f .gitmodules --get submodule.$name.path)
    surl=$(git config -f .gitmodules --get submodule.$name.url)
    sbr=$(git ls-remote --tags $surl | sed -r "/${hash:1}/ s|^.*tags/([^^]+).*\$|\1|p;d")
    if [ -z $sbr ]; then
        git clone $surl $spath
    else
        git clone -b $sbr --depth 1 --single-branch $surl $spath
    fi
done
git submodule update 

하위 모듈의 얕은 복제본은 특정 수정/변경 세트에서 스냅샷을 생성하므로 완벽합니다.웹사이트에서 zip을 다운로드하는 것이 쉬워서 스크립트를 시도해 보았습니다.

#!/bin/bash
git submodule deinit --all -f
for value in $(git submodule | perl -pe 's/.*(\w{40})\s([^\s]+).*/\1:\2/'); do
  mysha=${value%:*}
  mysub=${value#*:}
  myurl=$(grep -A2 -Pi "path = $mysub" .gitmodules | grep -Pio '(?<=url =).*/[^.]+')
  mydir=$(dirname $mysub)
  wget $myurl/archive/$mysha.zip
  unzip $mysha.zip -d $mydir
  test -d $mysub && rm -rf $mysub
  mv $mydir/*-$mysha $mysub
  rm $mysha.zip
done
git submodule init

git submodule deinit --all -f스크립트를 재사용할 수 있는 하위 모듈 트리를 지웁니다.

git submodule 40 charsha1의 합니다..gitmodules는 이 펄을 사용하고 을 펄을사용하콜구이분정연다된변다로 구분합니다.mysha그리고.mysub.

할 sha1과 입니다.url에서 .git 모듈에서.

일반적인 하위 모듈 항목의 경우:

[submodule "label"]
    path = localpath
    url = https://github.com/repository.git

myurl에 관한 열쇠.path =그런 다음 두 줄을 보고 값을 얻습니다.이 방법은 일관성 있게 작동하지 않을 수 있으며 개선이 필요합니다. grep을 합니다..git마지막과 일치시켜 참조를 입력합니다./그리고 어떤 것이든...

mydir이라mysub/name하위 모듈 이름으로 이어지는 디렉터리를 기준으로 합니다.

은 다은입니다.wget다운로드 가능한 zip 아카이브 url 형식을 사용합니다.나중에 변경될 수 있습니다.

을 풉니다.mydir하위 모듈 경로에 지정된 하위 디렉터리입니다.는 결폴더다마요됩니다소의 가 될 입니다.url-sha1.

하위 모듈 경로에 지정된 하위 디렉터리가 있는지 확인하고 이 디렉터리를 제거하여 추출된 폴더의 이름을 변경할 수 있도록 합니다.

mv경로로 합니다.sha1 파일 이름은 다음과 같습니다.

다운로드한 zip 파일을 삭제합니다.

서브모듈 입력

이는 솔루션이라기보다는 WIP 개념 증명에 가깝습니다.작동하면 지정된 변경 집합에 있는 하위 모듈의 얕은 복제본이 생성됩니다.

리포지토리에서 하위 모듈을 다른 커밋으로 재홈화하는 경우 스크립트를 다시 실행하여 업데이트합니다.

이러한 스크립트가 유용한 유일한 경우는 소스 프로젝트의 비협조적인 로컬 빌드에 사용되는 경우입니다.

메인 레포의 클로닝에 영향을 줄 수 없을 때 얕은 클로닝 서브모듈에 대한 솔루션이 필요했습니다.위의 한 솔루션을 기반으로 합니다.

#!/bin/bash
git submodule init
for i in $(git submodule | sed -e 's/.* //'); do
    git submodule update --init --depth 1 -- $i
done

언급URL : https://stackoverflow.com/questions/2144406/how-to-make-shallow-git-submodules

반응형