.gitignore의 git 하위 모듈을 무시하거나 저장소에 커밋합니까?


94

나는 내 프로젝트에 서브 모듈을 추가 한 project_dir/vendor/submodule_one내가 지금 실행 때마다 git status내가 얻을 modified: vendor/submodule_one (new commits).

내 질문은 이것을 처리하는 가장 좋은 방법은 무엇입니까? 내 메인 프로젝트가 내 서브 모듈의 세부 사항에 대해 알 필요가 없기 때문에 vendor/submodule_one-folder를 내 폴더에 추가 .gitignore합니까?

아니면 서브 모듈을 변경하고 커밋 할 때 메인 프로젝트에서도 커밋을해야합니까?

서브 모듈을 시작하기 만하면 설정 외에 많은 정보를 찾을 수없는 것 같습니다.

답변:


81

아니요, 하위 모듈을 추가 할 필요가 없습니다 .gitignore. 부모가 하위 모듈에서 보게되는 것은 gitlink ( 특수 항목,mode 160000 )입니다.

즉, 하위 모듈에서 직접 변경 한 사항은 상위 디렉토리에서 커밋이 뒤따라야합니다.
이렇게하면 상위 디렉토리는 하위 모듈의 상태에 대한 올바른 커밋을 기록합니다. 해당 커밋은 위에서 언급 한 "gitlink"입니다.

" git submodule update (true nature of submodules) " 에서 해당 정책에 대한 자세한 내용을 읽을 수 있습니다 .
하위 모듈의 기본 아이디어 는 특정 커밋에서 다른 저장소를 참조 하는 구성 요소 기반 접근 방식 입니다. 그러나 해당 하위 모듈에서 변경 사항이있는 경우 상위 저장소에서도 해당 참조를 업데이트해야합니다.


Git 2.13 (Q2 2017)에서는 gitlink를 무시 하지 않고 다음을 사용하여 하위 모듈을 무시할 수 있습니다.

git config submodule.<name>.active false

자세한 내용은 " Ignore new commits for git submodule " 참조하십시오 .


참고 : Git 2.15.x / 2.16 (2018 년 1 분기)에서는 하위 모듈을 무시하는 것이 더 정확합니다.
" git status --ignored --untracked"이 (가) 무시 된 디렉터리 자체를 무시한 것으로 표시하는 대신 무시 된 디렉터리에 포함 된 별도의 프로젝트 및 해당 다른 프로젝트의 파일을 나열하는 작업 트리에서 멈추지 않았습니다.

Johannes Schindelin ( )의 commit fadb482 (2017 년 10 월 25 일)를 참조하십시오 . (Merged by Junio ​​C Hamano -- in commit da7996a , 06 Nov 2017)dscho
gitster

status: 제외 된 디렉토리의 하위 모듈로 인해 혼동하지 마십시오.

우리는 재귀 할 때 추적되지 않는 파일이 아니라 제외되었음을 나타낼 수 있도록 exclude플래그를 treat_directory()함수에 꼼꼼하게 전달합니다 .

그러나 우리는 아직 서브 모듈을 같은 방식으로 취급하지 않았습니다.

그 때문에, git status --ignored --untracked서브 모듈로 submodulegitignored에서 tracked/은 "에서 서브 모듈을 보여줄 것 Untracked files"섹션, 예를 들어,

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

대신 " Ignored files"섹션에 하위 모듈을 표시하기를 원합니다 .

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
감사합니다 VonC, 당신이 그것을 넣을 때 완벽하게 이해됩니다.
sprysoft

9
이 대답은 질문 제목이 하위 모듈 폴더를 무시할지 여부를 묻고 나중에 질문 본문에서 별도의 질문에 예라고 대답하기 때문에 혼란 스럽습니다.
SgtPooki 2014

1
지금은 훨씬 더 의미가 있다고 생각하며 매우 유용한 심층 정보를 제공하고 있습니다. :) 업데이트에 대한 최고, 감사
SgtPooki

.gitignore에 대한 인수 : .gitsubmodules 파일에 포함 된 url에 사용자 이름 매개 변수가있는 사용자 특정 git url이 포함될 수 있는데 왜 체크인합니까?
djangofan

1
@djangofan 질문 (및 내 대답)은 하위 모듈 폴더 자체 ( gitlink로 나타내는 폴더 )를 무시하는 것 입니다. .gitmodules파일을 무시하는 것이 아닙니다 . 이 하나의 파일 ( .gitmodules)에는 자격 증명이 포함될 수 있지만 공용 저장소를 복제하는 데만 사용되는 경우에는이를 포함 할 필요가 없습니다. 또한 "Windows 용 Git Credential Manager"( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ) 와 같은 자격 증명 도우미를 사용하여 Windows에서도 어쨌든 캐시 할 수 있습니다 . 따라서에 자격 증명을 갖는 .gitmodules것은 치명적이지 않습니다.
VonC

8

어떤 이유로 submodule.module-name.active 가 나를 위해 작동하지 않았습니다.

그래서 submodule.module-name.ignore를 사용 했습니다.

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules- 여기서 매개 변수의 가능한 값에 대한 설명을 찾을 수 있습니다.

(새 커밋) 및 (수정 된 콘텐츠) 메시지에 대해 나를 위해 작동합니다.


1

수락 된 답변에 추가하기 위해 Git 하위 모듈 폴더를 .gitignore에 추가하면 실제로 문제가 발생한다는 것을 발견했습니다. 특히 프로젝트의 새로운 복제본을 만들려고 할 때 특히 그렇습니다. 특히 일반 하위 모듈 복제 명령을 실행하면 하위 모듈 폴더가 비어 있습니다.

git submodule init
git submodule update
git pull --recurse-submodules

재실행을 시도하는 것만으로

git submodule add <Git repo> <submodule folder>

출력을 기반으로 문제가 무엇인지 분명했습니다.

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

을 추가하는 대신 -f.gitignore에서 Git 하위 모듈 폴더를 제거하고 하위 모듈 복제 명령을 다시 실행하여 이제 폴더를 성공적으로 생성했습니다. 나는 서브 모듈 복제 명령 중 하나가 .gitignore를 존중하지만 그에 따라 서브 모듈을 건너 뛰고 있음을 경고하지 않는다는 버그가있을 수 있다고 생각합니다.

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