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.