Git은 새 하위 모듈을 초기화 / 동기화 / 업데이트하지 않습니다.


113

다음은 내 .gitmodules파일 내용의 일부입니다 .

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

그러나 .git/config첫 번째 만 포함합니다.

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

두 번째 하위 모듈 ( external/pyfacebook)은 다른 개발자가 기능 분기에 추가했습니다. 나는 지금 개발을 계승했으며 기능 브랜치를 확인했습니다. 그러나 Git은 나를 위해 하위 모듈을 가져 오지 않습니다. 난 노력 했어:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • 모든 서브 모듈 정의를 제거 .git/config하고 실행 git submodule init. 이전에 존재하는 하위 모듈 만 복사하고 새 하위 모듈은 무시합니다.
  • .git/config수동으로 새 하위 모듈 정의를 입력 하고 git submodule update. 이전에 존재하는 하위 모듈 만 업데이트됩니다.

다양한 조합으로 가능하지만 git은의 .git/config새로운 내용을 기반으로 업데이트되지 .gitmodules않으며 external/pyfacebook폴더를 생성 하고 하위 모듈의 내용을 가져 오지 않습니다 .

내가 무엇을 놓치고 있습니까? 수동 개입 (에 수동으로 하위 모듈 항목 추가 .git/config)이 정말로 필요하며 그 이유는 무엇입니까?

편집 : 수동 개입이 작동하지 않습니다. 새 하위 모듈 항목을 수동으로 추가 .git/config해도 아무 일도 일어나지 않습니다. 새 하위 모듈은 무시됩니다.


1
1.7.7.1을 실행 중이고 동일한 문제가 있음 : "git submodule sync"가 .gitmodules로 변경 한 후 .git / config를 업데이트하지 않습니다.
James Pritts 2011

답변:


35

최근에 git 버전 1.7.0.4로 업그레이드하셨습니까? 나는 지금 비슷한 문제를 겪고 있습니다 ...

편집 : 내 문제를 해결했지만 문제가 어디에 있는지 전혀 모릅니다. .git / config 및 .gitmodules에서 수동으로 하위 모듈 항목을 제거하고 사용 단계 (git submodule add 등 ...)로 하위 모듈을 다시 추가했습니다. Worksforme이지만이 스레드에 값을 추가하지 않습니다.


나는 지금 1.7.2까지 있지만 적어도 1.6.x 이후로 문제가 있다고 생각합니다.
David Eyk

그리고 네, 생각해 보면 결국 당신이 설명하는대로해야했습니다 (이 질문이 아직 열려 있다는 것을 잊었습니다!). 답변을 조금만 수정해도 괜찮다면 수락하겠습니다.
David Eyk 2010-08-27

9
이것은 git의 지속적인 약점입니다. svn조차도 외부에서 더 좋습니다.
Peter DeWeese 2011 년

3
나는 이것도 방금 만났다고 생각합니다 (같은 단계가 마침내 그것을 고치는 것 같습니다). 내가 알아 차린 유일한 점은 다시 추가하고 커밋 한 후 커밋이 다음과 같이 말했습니다. create mode 160000 lib / jruby-swing-helpers (huh?)
rogerdpack

1
"생성 모드 160000"에 대해 Pro Git 책은 다음과 같이 말합니다. "랙 항목에 대한 160000 모드에 유의하십시오. 이는 기본적으로 하위 디렉토리 나 파일." git-scm.com/book/en/Git-Tools-Submodules
Johann

92

.gitmodules 파일이 커밋되었지만 실제 서브 모듈 커밋 (즉, 서브 모듈의 커밋 ID 기록)은 그렇지 않은 것으로 밝혀졌습니다.

수동으로 추가하면 트릭을 수행하는 것처럼 보였습니다. 예 :

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(.git / config 또는 .gitmodules에서 아무것도 제거하지 않아도)

그런 다음 ID를 올바르게 기록하도록 커밋하십시오.

이 작업 답변에 몇 가지 추가 설명 추가 : git submodule init 또는 git submodule update가 작동하지 않으면 위에서 설명한대로 git submodule add url이 트릭을 수행해야합니다. 하나는 이것을 교차 확인할 수 있습니다.

 git config --list

그리고 git config --list 명령의 결과에서 가져 오려는 하위 모듈의 항목을 가져와야합니다. 구성 결과에 하위 모듈 항목이있는 경우 이제 일반적인 git 하위 모듈 업데이트 --init가 하위 모듈을 가져와야합니다. 이 단계를 테스트하려면 수동으로 하위 모듈의 이름을 바꾼 다음 하위 모듈을 업데이트 할 수 있습니다.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

하위 모듈에 로컬 변경 사항이 있는지 확인하려면 git status -u (서브 모듈의 변경 사항을 확인하려는 경우) 또는 git status --ignore-submodules (변경 사항을보고 싶지 않은 경우)를 통해 확인할 수 있습니다. 서브 모듈).


무엇입니까 external/pyfacebook?
IgorGanapolsky

2
@IgorGanapolsky 이것이 서브 모듈의 대상 경로입니다.
yuhua jul.

이것은 나를 도왔습니다, 많이 감사합니다! 대상 경로가 이미 존재하는 경우 (다른 명령을 시도한 결과로 수행 한) 다음과 같은 메시지가 표시되어 혼란을 더합니다.'your/local/path' already exists and is not a valid git repo
Michael Ambrus

1
"git config --list"의 항목을 git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
읽기위한 한 줄

64

git 버전 2.7.4. 이 명령은 로컬 코드를 업데이트합니다. git submodule update --init --force --remote


20
나를 위해 아무것도하지 않습니다.
Carlo Wood

1
git-submodule [documentation) ( git-scm.com/docs/git-submodule#git-submodule---remote ) 과 관련 하여 앞서 언급 한 명령은 하위 모듈의 로컬 분기를 업데이트해야합니다.
palik

1
@palik 당신은 바위!
Denis Trofimov

1
으로 개별 모듈을 업데이트 할 수 있습니다 git submodule update --init --force --remote <module-name>.
Adam Faryna 19

15

git이 무시 init하고 update명령 할 때 동일한 문제 가 있었고 아무것도하지 않았습니다.

어떻게 고치는 지

  1. 하위 모듈 폴더는 git repo에 커밋되어야합니다.
  2. .gitignore에 없어야합니다.

해당 요구 사항이 충족되면 작동합니다. 그렇지 않으면 모든 명령이 메시지와 결과없이 실행됩니다.

모든 작업을 수행했지만 여전히 작동하지 않는 경우 :

  1. 수동으로 서브 모듈 추가, 예 : git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. 모든 파일을 커밋하고 푸시- .gitmodules모듈 폴더 (폴더의 내용은 커밋되지 않음)
  5. 로컬 git repo를 삭제하십시오.
  6. 새 복제
  7. .git/config아직 하위 모듈이 없는지 확인하십시오.
  8. 이제 git submodule init- 그러면 모듈이 등록되었다는 메시지가 표시됩니다.
  9. git submodule update -모듈을 가져옵니다
  10. 이제 살펴보면 .git/config등록 된 하위 모듈을 찾을 수 있습니다.

1
나는 서브 모듈에 대한 경로가 .gitignore에있을 수 있다고 생각합니다. 적어도 @DaveJamesMiller의 답변을 따라 작동했습니다. 다른 것은 나를 위해 일하지 않았습니다.
gebbissimo

7

답변에 여기에 (또한) 많은 혼란이있는 것 같습니다.

git submodule init.git / config (.gitmodules에서)에서 마법처럼 물건을 생성하기위한 것이 아닙니다 . 부모 프로젝트를 복제하거나 이전에 존재하지 않는 하위 모듈을 추가하는 커밋을 가져온 후 완전히 비어있는 하위 디렉터리에 무언가를 설정하기위한 것입니다.

즉, git clone.gitmodules 파일이 .gitmodules 파일을 체크 아웃했다는 사실을 알 수있는 하위 모듈이있는 프로젝트 를 따릅니다 git submodule update --init --recursive.

당신은 할 수 없습니다 에 따라 git submodule add ...git submodule init(또는 git submodule update --init)이이 일에 예정되어 있지 않습니다. 사실, 추가는 이미 작동하는 경우 적절한 .git / config를 업데이트합니다.

편집하다

이전에 존재하지 않는 git 하위 모듈이 다른 사람에 의해 추가되고 git pull해당 커밋 을 수행하면 해당 하위 모듈의 디렉토리가 완전히 비어 있습니다 ( git submodule status새 하위 모듈의 해시 를 실행할 때 표시되어야하지만 -앞에 .가)이 경우 당신이 따라야 당신 git pull도와 git submodule update --init(플러스 --recursive는 서브 모듈은 새로운, 이전에 존재하지 않는, 서브 모듈 체크 아웃 얻기 위해) 서브 모듈 내부 때; 하위 모듈이있는 프로젝트의 초기 복제 후 (분명히 이전에 해당 하위 모듈이 없었던 경우)과 같습니다.


1
흥미로운 git help submodule점은 init에 대해 이렇게 말하고 있기 때문입니다 . "init : .gitmodules에서 .git / config로 하위 모듈 이름과 URL을 복사하여 인덱스에 기록 된 하위 모듈 (다른 곳에서 추가 및 커밋 됨)을 초기화합니다." 그것은 확실히 그래서 소리를 정확히 당신이하지 않는 말을 어떻게해야처럼 ...? git 문서에 대한 업데이트 시간?
Brad

@brad 나는 그렇게 말하지 않았다고 생각하지만 특정 사례에 대한 설명을 추가했습니다. 감사.
Carlo Wood

@CarloWood git 하위 모듈 작성자가 --init새 하위 모듈을 가져 오는 데 필요하다고 결정한 이유가 무엇인지 아십니까 (자동으로 가져 오는 대신 update)? 저장소를 업데이트하면 데이터가 파괴되지 않는 한 필요한 모든 것을 얻을 수있는 것 같습니다. 이를 통해 --init새 하위 모듈이 생성되었을 수 있음을 알거나 항상 매번 발행 할 --init때마다 기본적으로 활성화해야하는 것처럼 보입니다.
Catskul

@Catskul 분명히 git 하위 모듈의 작성자가 결정한 이유를 모르겠지만 "update"는 이미 존재하는 것을 업데이트하기 위해 예약되어 있고 "init"는 (로컬에서) 새로운 것을 만드는 데 사용된다는 것입니다. 내부적으로이 둘은 다른 명령을 내릴만큼 충분히 다를 수 있습니다.
Carlo Wood

6

나는 같은 문제가 있었지만 위의 해결책 중 어느 것도 도움이되지 않았습니다. .gitmodules 및 .git / config의 항목은 옳았지만 명령 git submodules update --init --recursive은 아무것도하지 않았습니다. 또한 하위 모듈 디렉토리를 제거하고 실행 git submodules update --init --recursive하여 하위 모듈 디렉토리를 되찾았지만 이전과 똑같은 커밋을 사용했습니다.

페이지 에서 답을 찾았습니다 . 명령은 다음과 같습니다.git submodule update --remote


2
이것은 또한 나에게 올바른 해결책이었습니다. 나는 실행중인 git submodule update대신 git submodule update --remote.
Andrew Medlin 19

5

정렬 마법의, 그러나 오늘 나는 달렸다 git submodule init다음에 git submodule sync다음에 git submodule update그것은 ... 매직을 내 서브 모듈을 당겨 시작? 혹시! 이것은 정말로 Git에서 가장 성가신 경험 중 하나입니다.

스크래치. 나는 실제로 git submodule update --init --recursive. 도움이 되었기를 바랍니다.

추신 : 서브 모듈이 아닌 루트 git 디렉토리에 있는지 확인하십시오.


7
아니 이것은 나에게 절대적으로 아무것도하지 않습니다.
IgorGanapolsky

@IgorGanapolsky 나는 위의 대답을 나를 위해 일한 것으로 편집했습니다. 작동하는지 알려주세요!
Levi Figueira

새 명령을 시도했지만 아무것도하지 않았습니다.
IgorGanapolsky

5

수동 설정으로 .gitmodules충분하다고 생각하는 것은 잘못되었습니다.

git version 2.22.0이 글을 쓰는 현재 내 지역 .

그래서 나는 왜 git submodule init작동 하지 않는지 궁금해하는 스레드에 왔습니다 . 나는 .gitmodules파일을 설정 하고 계속했다 git submodule init...

중대한

  1. git submodule add company/project.git includes/project필요합니다 (처음으로 모듈을 추가하는 경우).

    • 구성 추가 .git/config
    • .gitmodules파일 업데이트
    • 하위 모듈 위치를 추적합니다 ( includes/project이 예에서).
  2. 당신이 있어야 다음 git commit은 서브 모듈을 추가 한 후,이 커밋됩니다 .gitmodules및 추적 서브 모듈의 위치입니다.

프로젝트가 다시 복제되면 .gitmodules및 빈 하위 모듈 디렉토리가 있습니다 (예 : includes/project이 예). 이 시점에서 .git/config아직 git submodule init실행될 때까지 하위 모듈 구성 이 없으며 .gitmodulesAND includes/project가 기본 git 저장소에서 추적 되기 때문에 이것이 작동 한다는 것을 기억하십시오 .

또한 참조 :



3

나는 같은 문제가 있었다.

.gitmodules하위 모듈이 있지만 git submodule init명령 후에는 .git/config.

하위 모듈을 추가 한 개발자가 하위 모듈 디렉토리도 .gitignore파일에 추가 한 것으로 나타났습니다 . 작동하지 않습니다.


2

git submodule sync가 예상 한 작업을 수행하지 않는다는 것을 알게 된 것과 동일합니다. 명시 git submodule add적을 다시 수행 한 후에 만 하위 모듈 URL이 변경됩니다.

그래서이 스크립트를 ~/bin/git-submodule-sync.rb다음 위치에 넣었습니다 .

https://gist.github.com/frimik/5125436

또한 수신 후 몇 가지 git 배포 스크립트에도 동일한 논리를 사용합니다.

지금해야 할 일은 edit .gitmodules, 그런 다음이 스크립트를 실행하는 것뿐입니다. 마침내 생각했던대로 작동 git submodule sync합니다.


이것은 Git의 버그로 인해 일부 저장소에서만 발생하는 것 같습니다. 새로 생성 된 리포지토리에서는 오랫동안 발생하지 않았지만, 과거에는 특정 리포지토리에서 항상 발생했습니다.
fridh

2

나는 오늘 똑같은 문제가 있었고 내가 입력했기 때문에 git submodule init다음 줄이 있음을 알았습니다 .git/config.

[submodule]
   active = .

나는 그것을 제거하고 다음을 입력했습니다.

git submodule update --init --remote

그리고 모든 것이 정상으로 돌아 왔고 내 하위 모듈은 평소와 같이 하위 디렉토리에서 업데이트되었습니다.


2

나에게 문제는 repo의 이전 개발자가 submodules/thing폴더를 일반 폴더로 커밋했다는 것입니다. 즉, 실행하려고 할 때 git submodule add ...다음과 함께 실패합니다.'submodules/thing' already exists in the index 는 경로가하지 않았다는 것을 보았 기 때문에 아직도 실패 서브 모듈을 업데이트하려고, 하위 모듈을 포함합니다.

수정하려면 submodules/thing폴더 를 삭제하고 삭제를 커밋 한 다음 git submodule add명령을 실행하여 올바르게 다시 추가해야했습니다.

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing

1

나는이 오늘 볼 때, 개발자는 새로운 하위 디렉토리 트리의 일부를 이동했고 그의 자식 클라이언트 트리에서 업데이트 된 하위 프로젝트 규칙을 기록하지 않은 것처럼 떠나는 대신 그들은 단지 핵 공격하고, 보이는 .gitmodules부실을 모두 참조 현재 트리에 더 이상 존재하지 않는 위치 및 하위 프로젝트에.

하위 모듈을 다시 추가하고 하위 모듈의 커밋 shas를 git show $breaking_commit_sha(regexp와 일치하는 줄 검색) 에서 찾은 것과 비교하여 ^-Subproject필요한 수정 사항을 조정합니다.


1

이전에 존재하는 경우 하위 모듈 dir 및 그 내용 ( "external / pyfacebook"폴더)을 삭제하면 git submodule add ...문제가 해결 될 수 있습니다.


1
이것이 저에게 문제였습니다. 누군가 "submodule"폴더를 일반 폴더로 커밋했습니다. 즉, "git submodule add ..."를 실행하려고하면 " 'vendor / mobx-state-tree'가 이미 인덱스에 있습니다."와 함께 실패합니다. , 그러나 하위 모듈을 업데이트하려는 시도도 경로에 하위 모듈이 포함되지 않았기 때문에 실패합니다). 수정하려면 폴더를 삭제하고 삭제를 커밋 한 다음 git add 명령을 실행하여 올바르게 다시 추가해야했습니다.
Venryx 2011

1

하위 모듈에 비슷한 문제가 있습니다. 복제 / 풀링 / 업데이트 / 무엇이든 원하지 않았습니다.

사용하여 하위 모듈을 다시 추가하려고 할 때 git submodule add git@my-repo.git destination다음 출력이 표시됩니다.

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

그래서 나는 add 명령시행 하려고했습니다 .
git submodule add --force git@my-repo.git destination

제 경우에는 효과가있었습니다.


0

기록을 위해 : 빈 저장소 를 하위 모듈로
추가하여 동일한 문제를 만들었습니다 . 이 경우 하위 모듈에 사용할 수있는 참조 해시가 없으므로 원본 포스터에 설명 된 오류가 발생합니다.

문제를 해결 한 후 저장소를 강제로 추가하면 (Arvids 게시물에서와 같이)
git submodule add --force git@my-repo.git destination


0
  • 당신의 서브 모듈을 제거하십시오 .git/config
  • 실행 git submodule init명령
  • 하위 모듈 디렉토리로 이동하여 실행하십시오. git pull origin master

지금 작동합니다


0

나를 위해 일한 것을 공유하십시오.

git clone --recurse-submodules <repository path>

이것은 이미 서브 모듈을 포함하고있는 원격 저장소를 복제합니다. 즉, 복제 후 git submodule update 또는 init를 실행할 필요가 없습니다.


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