git 하위 모듈이 프로덕션으로 푸시되지 않았습니다.
두 개의 하위 모듈이있는 새 저장소를 방금 만들었습니다. 로컬에서는 잘 작동하지만 프로덕션으로 푸시 할 때 하위 모듈이 없습니다. 각 하위 모듈 루트 디렉토리가 있지만 내부에 파일이 없습니다.
git version 2.27.0
프로덕션에서 저장소 만들기
git --bare init
cd hooks && touch post-receive && chmod +x post-receive
cat hooks/post-receive
#/bin/sh
git --work-tree=/var/www/repo --git-dir=/var/git_repos/repo.git checkout -f
개발 / 로컬에서 프로덕션으로 푸시
git push production master
git status
모든 것이 최신 상태임을 알려줍니다. 서브 모듈 폴더에서 호출 되더라도. 로컬 저장소에서 하위 모듈 폴더를 삭제하려고했습니다. 저장소에 커밋 / 푸시했습니다. 그런 다음 git push production master
프로덕션 서버에서 루트 하위 모듈 폴더가 삭제되었습니다. 그런 다음 다시 추가하려고
# git submodule add [email protected]:alias/repo_name.git php/repo/repo_name
Cloning into '/var/www/project/php/repo/repo_name'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 19 (delta 8), reused 19 (delta 8), pack-reused 0
Receiving objects: 100% (19/19), 8.62 KiB | 8.62 MiB/s, done.
Resolving deltas: 100% (8/8), done.
그런 다음 저장소에 커밋하고 git push production master
. 같은 문제입니다. 프로덕션에서는 하위 모듈의 루트 폴더가 있지만 디렉토리에 파일이 없습니다.
github에서 저장소를 탐색 할 때 하위 모듈이 올바르게 연결됩니다.
모든 것이 로컬 저장소에서 작동합니다.

답변
하위 모듈 폴더는 github (또는 로컬 저장소)에서 비어 있지 않지만 프로덕션으로 푸시 할 때
예상되는 사항 : 하위 모듈은 다음으로 구성됩니다.
- 에 등록 된 URL
.gitmodules
- a gitlink, 하위 모듈 저장소 루트 트리의 SHA1을 나타내는 색인의 특수 항목입니다.
git clone --recurse-submodules옵션을 사용하여 하위 모듈로 원격 저장소를 복제하면 해당 하위 모듈 저장소가 자체적으로 복제되고 해당 gitlink가 나타내는 SHA1에서 체크 아웃됩니다.
"Pushing to production (프로덕션으로 푸시)"은 체크 아웃 된 (베어가 아닌) 저장소로 푸시하지 않아야하기 때문에 까다 롭습니다 ( 기술적으로도 수행 할 수 있음 ).
프로덕션에서 베어 저장소로 푸시하는 것이 더 낫 습니다. 수신 후 후크 를 사용하여 파일을 복원합니다 (서브 모듈 컨텐츠 포함,를 사용 git restore --recurse-submodules).
토론 후 :
하위 모듈이
.gitmodules
SSH URL을 사용하여에 등록되었으므로 프로덕션 서버에 공개 SSH 키가 계정에 등록되어 있어야합니다 .수신 후 스크립트는 다음과 같습니다.
#!/bin/bash cd /var/www/repo git --git-dir=/var/git_repos/repo.git --work-tree=. restore --recurse-submodules :/
으로 git submodule, 당신은 분명히 작업 트리를 설정할 수 없습니다
즉, 하위 모듈이 관련된 경우 현재 폴더가 작업 트리 여야합니다.
그런 다음 다른 git-dir ( )을 사용해도 git checkout
/ git restore
with --recurse-submodules
, 또는 같은 명령을 수행 할 수 있습니다 .git submodule update --init
--git-dir=/path/to/bare/repo.git
현재 작업중인 트리가 올바른 트리이므로 하위 모듈이 업데이트됩니다.
당신은 어느 곳보다 경우 /var/www/repo
사용자가 지정한없는 경우에도 git --work-tree=/var/www/repo ...
, 상기 명령의 어느 git checkout
/ git restore
로 --recurse-submodules
, 또는 git submodule update --init
당신의 repo의 서브 모듈에 대한 작동합니다.
즉 /var/www/repo
, 파일이 복원되지만 하위 모듈은 비어 있습니다.