git 하위 모듈이 프로덕션으로 푸시되지 않았습니다.

Nov 26 2020

두 개의 하위 모듈이있는 새 저장소를 방금 만들었습니다. 로컬에서는 잘 작동하지만 프로덕션으로 푸시 할 때 하위 모듈이 없습니다. 각 하위 모듈 루트 디렉토리가 있지만 내부에 파일이 없습니다.

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에서 저장소를 탐색 할 때 하위 모듈이 올바르게 연결됩니다.

모든 것이 로컬 저장소에서 작동합니다.

답변

VonC Nov 28 2020 at 03:24

하위 모듈 폴더는 github (또는 로컬 저장소)에서 비어 있지 않지만 프로덕션으로 푸시 할 때

예상되는 사항 : 하위 모듈은 다음으로 구성됩니다.

  • 에 등록 된 URL .gitmodules
  • a gitlink, 하위 모듈 저장소 루트 트리의 SHA1을 나타내는 색인의 특수 항목입니다.

git clone --recurse-submodules옵션을 사용하여 하위 모듈로 원격 저장소를 복제하면 해당 하위 모듈 저장소가 자체적으로 복제되고 해당 gitlink가 나타내는 SHA1에서 체크 아웃됩니다.

"Pushing to production (프로덕션으로 푸시)"은 체크 아웃 된 (베어가 아닌) 저장소로 푸시하지 않아야하기 때문에 까다 롭습니다 ( 기술적으로도 수행 할 수 있음 ).

프로덕션에서 베어 저장소로 푸시하는 것이 더 낫 습니다. 수신 후 후크 를 사용하여 파일을 복원합니다 (서브 모듈 컨텐츠 포함,를 사용 git restore --recurse-submodules).


토론 후 :

  1. 하위 모듈이 .gitmodulesSSH URL을 사용하여에 등록되었으므로 프로덕션 서버에 공개 SSH 키가 계정에 등록되어 있어야합니다 .

  2. 수신 후 스크립트는 다음과 같습니다.

    #!/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 restorewith --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, 파일이 복원되지만 하위 모듈은 비어 있습니다.