programing

Git 하위 모듈을 추가할 때 분기/태그를 지정하려면 어떻게 해야 합니까?

testmans 2023. 5. 15. 21:22
반응형

Git 하위 모듈을 추가할 때 분기/태그를 지정하려면 어떻게 해야 합니까?

안녕하십니까?git submodule add -b이요?일이요?

분기가 후 새 )git submodule update --init지점 특정 것입니다().git status하위 모듈에 "현재 분기에 없음"이 표시됩니다.

▁on다에 대한 를 찾을 수 없습니다.gitmodules또는.git/config서브모듈의 분기나 특정 커밋에 대해 어떻게 알아낼 수 있을까요?

또한 분기 대신 태그를 지정할 수 있습니까?

버전 1.6.5.2를 사용하고 있습니다.

저는 여기에 다른 답들의 집합체에 불과한 답을 추가하고 싶습니다. 하지만 저는 그것이 더 완전할 수도 있다고 생각합니다.

여러분은 이 두 가지를 가지고 있을 때 Git 서브모듈을 가지고 있다는 것을 알고 있습니다.

  1. 당신의..gitmodules다음과 같은 항목이 있습니다.

     [submodule "SubmoduleTestRepo"]
         path = SubmoduleTestRepo
         url = https://github.com/jzaccone/SubmoduleTestRepo.git
    
  2. Git 저장소에 하위 모듈 개체(이 예에서는 SubmoduleTestRepo라는 이름)가 있습니다.GitHub은 이러한 개체를 "하위 모듈" 개체로 표시합니다.아니면 하라git submodule status명령행에서.Git 하위 모듈 개체는 Git 개체의 특수한 종류이며 특정 커밋에 대한 SHA 정보를 보유합니다.

    당신이 할 때마다git submodule update서브모듈에 커밋의 콘텐츠가 채워집니다.그것은 정보 때문에 커밋을 어디서 찾아야 하는지 알고 있습니다..gitmodules.

    자, 모것들이.-b에 한 입니다..gitmodules파일입니다. 같은 예를 따르자면, 다음과 같습니다.

     [submodule "SubmoduleTestRepo"]
         path = SubmoduleTestRepo
         url = https://github.com/jzaccone/SubmoduleTestRepo.git
         branch = master
    

    참고: 지점 이름만 지원됩니다..gitmodules파일, 그러나 SHA TAG는 지원되지 않습니다! (대신 "를 사용하여 각 모듈에 대한 지점의 커밋을 추적하고 업데이트할 수 있습니다.git add .를 들어 를들면예와 같은git add ./SubmoduleTestRepo그리고 당신은 그것을 바꿀 필요가 없습니다..gitmodules매번 파일링)

    하위 모듈 개체가 여전히 특정 커밋을 가리키고 있습니다. 한것은일이 유일하게 있는 것.-b당신에게 구매하는 옵션은 추가할 수 있는 능력입니다.--remoteVogella의 답변에 따라 업데이트에 플래그를 표시합니다.

     git submodule update --remote
    

    하위 모듈이 가리키는 커밋에 하위 모듈의 내용을 채우는 대신 마스터 분기의 최신 커밋으로 해당 커밋을 바꾼 다음 하위 모듈을 해당 커밋으로 채웁니다.djacobs7 답변을 통해 두 단계로 수행할 수 있습니다.이제 하위 모듈 개체가 가리키는 커밋을 업데이트했으므로 변경된 하위 모듈 개체를 Git 저장소에 커밋해야 합니다.

    git submodule add -b지점에서 모든 것을 최신 상태로 유지하는 마법 같은 방법은 아닙니다.에 입니다..gitmodules파일 및 하위 모듈 개체를 채우기 전에 지정된 분기의 최신 커밋으로 업데이트할 수 있는 옵션을 제공합니다.

참고: Git 1.8.2는 분기를 추적할 수 있는 기능을 추가했습니다.아래의 몇 가지 답변을 참조하십시오.


이것에 익숙해지기에는 조금 혼란스럽지만, 하위 모듈은 분기점에 없습니다.당신이 말했듯이, 그것들은 서브모듈 저장소의 특정 커밋에 대한 포인터일 뿐입니다.

즉, 다른 사용자가 리포지토리를 체크아웃하거나 코드를 풀어서 하위 모듈 업데이트를 수행하면 하위 모듈이 해당 특정 커밋으로 체크아웃됩니다.

이는 자주 변경되지 않는 하위 모듈에 적합합니다. 그러면 프로젝트의 모든 사용자가 동일한 커밋에서 하위 모듈을 가질 수 있기 때문입니다.

하위 모듈을 특정 태그로 이동하려는 경우:

cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push

그러면 submodule_directory를 해당 태그로 변경하고자 하는 다른 개발자가 이를 수행합니다.

git pull
git submodule update --init

git pull하위 모듈 디렉터리 포인트를 커밋하는 변경 사항. git submodule update새 코드에서 실제로 병합됩니다.

(Git 2.22, 2019년 2분기 도입)

분기를 아직 추적하지 않는 기존 하위 모듈이 있는 경우(1.8.2+가 있는 경우):

  • 상위 레포가 하위 모듈이 이제 분기를 추적한다는 것을 알고 있는지 확인합니다.

      cd /path/to/your/parent/repo
      git config -f .gitmodules submodule.<path>.branch <branch>
    
  • 하위 모듈이 실제로 해당 분기의 최신 버전인지 확인합니다.

      cd path/to/your/submodule
      git checkout -b branch --track origin/branch
        # if the master branch already exist:
        git branch -u origin/master master
    

(업스트림 원격 repo의 이름은 'repo'이며 하위 모듈이 복제되었습니다.
         A git remote -v하위 모듈 내부에 표시됩니다.일반적으로 '오리진'입니다.)

  • 하위 모듈의 새 상태를 상위 레포에 기록하는 것을 잊지 마십시오.

      cd /path/to/your/parent/repo
      git add path/to/your/submodule
      git commit -m "Make submodule tracking a branch"
    
  • 후속 는 " " " " " " 을 .--remote옵션:

      # update your submodule
      # --remote will also fetch and ensure that
      # the latest commit from the branch is used
      git submodule update --remote
    
      # to avoid fetching use
      git submodule update --remote --no-fetch 
    

Lolorol코멘트에서 각 하위 모듈에 분기를 설정할 것을 제안합니다.

git submodule update --init --recursive
git submodule foreach -q --recursive \
  'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch ${branch}'
git submodule

Git 2.10+(2016년 3분기)에서는 '를 사용할 수 있습니다..지점 이름으로:

분기의 이름은 다음과 같이 기록됩니다.submodule.<name>.branch.gitmodules위해서update --remote.
하위 모듈의 분기 이름이 현재 리포지토리의 현재 분기 이름과 동일해야 함을 나타내는특수 값()이 사용됩니다.

하지만, 루보스의 논평대로.

와 함께git checkout올" 음에올인이지름이경 " 우다점인경"인 .그것은 당신의 헌신적이지 않은 일을 죽일 것입니다!
대신 사용합니다.

이는 Git 2.23(2019년 8월) 이상을 의미합니다.

자세한 내용은 "다음 사용자"를 참조하십시오.


분기에 이어 모든 하위 모듈을 업데이트하려는 경우:

    git submodule update --recursive --remote

Dan Cameron이 답변에서 언급했듯이 업데이트된 각 하위 모듈의 결과는 거의 항상 분리된 HEAD입니다.

(Clintm주석에 다음과 같이 기록합니다(실행할 경우).git submodule update --remote그리고 그 결과 sha1은 서브모듈이 현재 있는 분기와 동일하며, 아무것도 하지 않고 서브모듈을 분리된 헤드 상태가 아닌 "그 분기" 상태로 유지합니다.)

분기가 실제로 체크아웃되었는지 확인하기 위해(그리고 상위 repo의 하위 모듈을 나타내는 특수 항목의 SHA1을 수정하지 않음), 그는 다음을 제안합니다.

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'

각 하위 모듈은 여전히 동일한 SHA1을 참조하지만, 새 커밋을 수행할 경우 하위 모듈이 추적할 분기에서 참조되므로 이를 푸시할 수 있습니다.
하위 모듈 내에서 푸시를 수행한 후에는 상위 repo로 돌아가서 수정된 하위 모듈에 대해 새 SHA1을 추가, 커밋 및 푸시하는 것을 잊지 마십시오.

의 사용에 주의합니다.$toplevelAlexander Pogrebnyak의 댓글에서 추천했습니다.
$toplevel2010년 5월 git1.7.2에 도입되었습니다. commit f030c96.

합니다..gitmodules입니다.

dtmland 설명에 추가합니다.

각 스크립트는 분기를 따르지 않는 하위 모듈을 체크아웃하지 못합니다.
그러나 이 명령은 다음과 같은 두 가지를 모두 제공합니다.

 git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –

동일하지만 읽기 쉬운 명령:

git submodule foreach -q --recursive \
    'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
     [ "$branch" = "" ] && \
     git checkout master || git switch $branch' –
  

umläutedtmland의 명령을 단순화된 버전으로 수정했습니다.

git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

다중 선:

git submodule foreach -q --recursive \
  'git switch \
  $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

Git 2.26(2020년 1분기) 이전에는 하위 모듈에서 업데이트를 재귀적으로 가져오라는 페치가 필연적으로 대량의 출력을 생성하고 오류 메시지를 발견하기가 어려워졌습니다.

작업 종료 오류가 발생한 하위 모듈을 열거하도록 명령이 학습되었습니다.

에밀리 셰퍼()nasamuffin의 커밋 0222540(2020년 1월 16일)을 참조하십시오.
(주니오 C 하마노에 의해 합병 -- -- commit b5c71cc, 2020년 2월 5일)

fetch하위 모듈 가져오기 중 오류 강조

사인 오프 바이: 에밀리 셰퍼

fetch가 많은 fetch가 실패하는 둘 fetch에 하면 다른 .fetch-by-oid.
사용자가 무언가 잘못되었다는 것을 인식하고 어디서 고장이 났는지 늦게 호출합니다.

ㅠㅠfetch_finish()는 에의서동호출됩다니로으기적만해▁called에 의해서만 으로 호출됩니다.run_processes_parallel,주변에 뮤텍스가 필요하지 않습니다.submodules_with_errors.


Git 2.28 (2020년 3분기)에서는 스크립트로 작성된 "git submodule" Porpher 명령의 일부를 다시 쓰기가 계속됩니다. 이번에는 "" 하위 명령의 차례입니다.git submodule set-branch

Shourya Shukla periperidip()의 커밋 2964d6e (2020년 6월 2일)를 참조하십시오.
(주니오 C 하마노에 의해 합병되었습니다 -- -- 커밋 1046282, 2020년 6월 25일)

submodule포트 하위 명령 'set-branch'를 셸에서 C로

멘토:크리스티안 쿠더
멘토: 카아틱 시바람
도움을 받은 사람: 덴튼
에릭 선샤인
도움을 받은 사람: 도안 쩐 콩 단
사인 오프 바이: Shourya Shukla

subcommand 합니다.git submodule.sh.

Git 1.8.2는 분기를 추적할 수 있는 가능성을 추가했습니다.

# add submodule to track branch_name branch
git submodule add -b branch_name URL_to_Git_repo optional_directory_rename

# update your submodule
git submodule update --remote 

참고 항목: Git 하위 모듈

Git 하위 모듈을 사용하는 방법에 대한 예입니다.

  1. 새 리포지토리 만들기
  2. 그런 다음 다른 리포지토리를 하위 모듈로 복제합니다.
  3. 그런 다음 하위 모듈이 V3.1.2라는 태그를 사용하도록 합니다.
  4. 그리고 나서 우리는 커밋합니다.

그리고 이것은 약간 다음과 같습니다.

git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status 

혹시 (가지가 아닌 태그를 사용해도) 도움이 될까요?

기존 답변에는 두 번째 단계가 누락되고 세부 정보가 오버로드되었습니다.

기존 하위 모듈을 전환하여 새 원격 URL 및/또는 새 분기를 추적하려면 다음과 같이 하십시오.

  1. 진의소편집에서 진실의 합니다..gitmodules.

예를 들어, 에서

[submodule "api"]
    path = api
    url = https://github.com/<original_repo>/api.git

로.

[submodule "api"]
    path = api
    url = https://github.com/<another_repo>/api.git
    branch = work-in-progress

사용할 수도 있습니다.hexsha커밋 해시의 경우.또는tag하지만 3번을 보세요.

  1. git submodule syncgit in으로 캐시된 하위 모듈에 대한 설명을 업데이트합니다..git/modules에 명시된 방금 입증된 진실의 원천으로부터..gitmodules.

  2. 태그를 에만:git submodule foreach --recursive 'git fetch --tags'태그를 가져옵니다.

  3. git submodule update --init --recursive --remote작업 복사본에서 체크아웃된 하위 모듈을 업데이트합니다.

  4. 변경 내용을 커밋합니다.

제 경험에 따르면 슈퍼 프로젝트나 향후 체크아웃에서 분기를 전환하면 서브모듈이 적절하게 추가되고 추적되는지 여부에 관계없이 서브모듈의 분리된 HEAD가 여전히 발생합니다(예: @djacobs7 및 @Johnny Z 응답).

또한 수동으로 올바른 분기를 체크아웃하거나 스크립트 Git 하위 모듈을 통해 각 분기를 수동으로 체크아웃하는 대신 사용할 수 있습니다.

하위 모듈 구성 파일에서 분기 속성을 확인하고 설정된 분기를 확인합니다.

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel.gitmodules submodule.$name.branch)"; git checkout $branch'

Git 하위 모듈은 약간 이상합니다. 항상 "분리 헤드" 모드에 있습니다. 예상하는 것처럼 분기의 최신 커밋으로 업데이트되지 않습니다.

하지만 생각해보면 이것은 어느 정도 일리가 있습니다.를 들어 서브모듈 바를 사용하여 저장소 foo를 생성한다고 가정합니다.변경사항을 푸시하고 저장소 foo에서 commit a7402be를 확인하라고 합니다.

그런 다음 복제본을 만들기 전에 다른 사용자가 리포지토리 표시줄을 변경한다고 가정합니다.

당신이 저장소 foo에서 commit a7402be를 체크아웃할 때, 당신은 내가 누른 것과 같은 코드를 받을 것이라고 예상합니다.그렇기 때문에 명시적으로 명령한 다음 새 커밋을 수행해야 하위 모듈이 업데이트됩니다.

개인적으로 저는 서브모듈이 Git에서 가장 혼란스러운 부분이라고 생각합니다.서브모듈을 저보다 더 잘 설명할 수 있는 곳이 많습니다.저는 스콧 샤콘의 프로 을 추천합니다.

하위 모듈의 분기를 전환하려면(하위 모듈이 이미 저장소의 일부로 있다고 가정):

  • cd 입니다.
  • 을 엽니다..gitmodules
  • 아래에 줄 path = ...그리고.url = ...그렇다고는 해도branch = your-branch모듈에 , : 파일 " " ", " ".gitmodules.
  • 디렉터리를 그런다음디리변를않다실니합행고지경하토렉▁then▁do다니▁without▁changing합실▁directory.$ git submodule update --remote

...이렇게 하면 수정된 각 하위 모듈에 대해 지정된 분기에 대한 최신 커밋을 가져올 수 있습니다.

내 안에 이것이 있습니다..gitconfig파일. 아직 초안이지만 현재로서는 유용한 것으로 입증되었습니다.항상 하위 모듈을 분기에 다시 연결하는 데 도움이 됩니다.

[alias]

######################
#
# Submodules aliases
#
######################

# git sm-trackbranch: places all submodules on their respective branch specified in .gitmodules
# This works if submodules are configured to track a branch, i.e if .gitmodules looks like:
# [submodule "my-submodule"]
#   path = my-submodule
#   url = git@wherever.you.like/my-submodule.git
#   branch = my-branch
sm-trackbranch = "! git submodule foreach -q --recursive 'branch=\"$(git config -f $toplevel/.gitmodules submodule.$name.branch)\"; git checkout $branch'"

# sm-pullrebase:
# - pull --rebase on the master repo
# - sm-trackbranch on every submodule
# - pull --rebase on each submodule
#
# Important note:
# - have a clean master repo and subrepos before doing this!
# - this is *not* equivalent to getting the last committed
#   master repo + its submodules: if some submodules are tracking branches
#   that have evolved since the last commit in the master repo,
#   they will be using those more recent commits!
#
#   (Note: On the contrary, git submodule update will stick
#   to the last committed SHA1 in the master repo)
sm-pullrebase = "! git pull --rebase; git submodule update; git sm-trackbranch ; git submodule foreach 'git pull --rebase' "

# git sm-diff will diff the master repo *and* its submodules
sm-diff = "! git diff && git submodule foreach 'git diff' "

# git sm-push will ask to push also submodules
sm-push = push --recurse-submodules=on-demand

# git alias: list all aliases
# useful in order to learn git syntax
alias = "!git config -l | grep alias | cut -c 7-"

Quack을 사용하여 다른 Git 저장소에서 특정 모듈을 꺼냅니다.제공된 저장소의 전체 코드 기반 없이 코드를 가져와야 합니다. 대용량 저장소에서 매우 특정한 모듈/파일이 필요하며 업데이트를 실행할 때마다 업데이트되어야 합니다.

그래서 우리는 다음과 같은 방법으로 이를 달성했습니다.

구성 만들기

name: Project Name

modules:
  local/path:
    repository: https://github.com/<username>/<repo>.git
    path: repo/path
    branch: dev
  other/local/path/filename.txt:
    repository: https://github.com/<username>/<repo>.git
    hexsha: 9e3e9642cfea36f4ae216d27df100134920143b9
    path: repo/path/filename.txt

profiles:
  init:
    tasks: ['modules']

위의 구성을 사용하면 첫 번째 모듈 구성에 지정된 대로 제공된 GitHub 저장소에서 하나의 디렉터리를 만들고 다른 하나는 지정된 저장소에서 파일을 끌어와 만드는 것입니다.

다른 개발자들은 실행만 하면 됩니다.

$ quack

그리고 위의 구성에서 코드를 가져옵니다.

하위 모듈에 대한 분기를 선택하는 유일한 효과는 다음과 같습니다.--remotegit submodule update명령줄, Git는 분리된 HEAD 모드에서 체크아웃합니다(기본값인 경우).--checkout동작이 선택됨). 선택한 원격 분기의 최근 커밋입니다.

하위 모듈의 얕은 클론으로 작업하는 경우 Git 하위 모듈에 대해 이 원격 분기 추적 기능을 사용할 때 특히 주의해야 합니다.하위 모듈 설정에서 이 목적으로 선택한 분기는 다음 기간 동안 복제될 분기가 아닙니다.git submodule update --remote만약 당신이 또한 통과한다면.--depth매개 변수 및 사용자는 복제할 분기에 대해 Git에 지시하지 않습니다. 실제로는 에서 복제할 수 없습니다.git submodule update명령줄!!, 그것은 암시적으로 설명된 것처럼 행동할 것입니다.git-clone(1)에대문서에 대한 .git clone --single-branch명시적인 경우에는--branch매개 변수가 없으므로분기만 복제됩니다.

놀랄 것도 없이, 복제 단계가 수행된 후에.git submodule update명령을 실행하면 하위 모듈에 대해 이전에 설정한 원격 분기에 대한 최신 커밋을 최종적으로 체크아웃하려고 하며, 이 커밋이 기본 브랜치가 아니면 로컬 얕은 클론의 일부가 아니므로 다음과 함께 실패합니다.

치명적: 단일 수정이 필요함

하위 모듈 경로 'mySubmodule'에서 현재 오리진을 찾을 수 없음/NotThePrimaryBranch 개정판

git 하위 모듈 add -b develop --name branch-name --https://git

다음 명령을 사용합니다.

하위 모듈 추가 방법(분기-분기)

git submodule add -b stage git@github.optum.com:orgname/${reponame}.git

하위 모듈 업데이트(지점-지점)

######Clone########

> git clone -b master --single-branch --recurse-submodules git@github.com:orgname/project.git  
or  
> git clone -b stage --single-branch --recurse-submodules git@github.com:orgname/project.git

######Update#######
> git submodule update  --remote (only for remote branch -ie master) 
or 
> git submodule update --recursive --remote

> git submodule update --init --recursive (for remaining branchs)

if you get fatal need single revision error then use below commands:-

before:-

*** stage
  remotes/origin/stage**

git branch -a

git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/{branch name}
ex:- git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/stage

after:-
*** stage
  remotes/origin/HEAD -> origin/stage
  remotes/origin/stage**

then 

> git reset --hard

#hard reset revisions#

> git submodule foreach git reset --hard origin/develop

> git submodule foreach git pull origin develop

커밋하고 그에 따라 밀어낸 후에..이제 하위 모듈이 업데이트됩니다.

언급URL : https://stackoverflow.com/questions/1777854/how-can-i-specify-a-branch-tag-when-adding-a-git-submodule

반응형