Git 서브 모듈을 추적하지 않는 상태에서 제거하는 방법?


149

Git의 서브 모듈에서 추적되지 않은 콘텐츠를 제거 할 수없는 것 같습니다. 실행 git status수율 :

# 지점 마스터
# 커밋을 위해 변경되지 않은 변경 사항 :
# (커밋 할 내용을 업데이트하려면 "git add ..."를 사용하십시오)
# ( "git checkout-..."을 사용하여 작업 디렉토리의 변경 사항을 버리십시오)
# (서브 모듈에서 추적되지 않거나 수정 된 내용을 커밋하거나 버리십시오)
#
# 수정 : 번들 / 스닙 메이트 (추적되지 않은 콘텐츠)
# 수정 : 번들 / 서라운드 (추적되지 않은 콘텐츠)
# 수정 : 번들 / 트레일 링-공백 (추적되지 않은 내용)
# 수정 : 번들 / 젠 코딩 (추적되지 않은 콘텐츠)
#
커밋에 추가 된 변경 사항 없음 ( "git add"및 / 또는 "git commit -a"사용)

--ignore-submodules매개 변수를 추가하면 이 메시지가 숨겨집니다. 하지만이 먼지를 더 적절하고 핵심적인 방식으로 제거 할 수있는 방법이 있는지 궁금합니다.


3
이 답변 : stackoverflow.com/a/5127213/199649는 더 많은 옵션을 불러옵니다.
charlax

답변:


95

자식 상태는 추적되지 않은 내용을보고하므로 실제 상태를 유지하는 실제 방법은 해당 하위 모듈 각각에 들어가는 것입니다.

  • 추적되지 않은 내용을 추가하고 커밋
  • 또는 .gitignore각 모듈 에 따라 추적되지 않은 내용을 참조하십시오 .
  • 또는 당신은 서브 모듈의 동일한 무시 컨텐츠를 추가 할 수 있습니다 .git/info/exclude로, peci1의 보고서 코멘트에 .
  • 또는 ezraspectre답변에 언급 된대로 서브 모듈 사양에 더티를 추가하십시오 (위).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • 또는 전역 .gitignore 파일을 추가 하십시오 (종종 ~/.gitignore-global). 예를 들어처럼 .DS_Store또는 제 경우 Carthage/Build에 의해보고 된 마리아 서니코멘트 . 참조 .gitginore맨 페이지를 :

사용자가 모든 상황에서 Git이 무시하도록하려는 패턴 (예 : 사용자가 선택한 편집기에서 생성 한 백업 또는 임시 파일)은 일반적으로 core.excludesFile사용자의에 지정된 파일로 이동합니다 ~/.gitconfig. 기본값은 $XDG_CONFIG_HOME/git/ignore입니다. 이 $XDG_CONFIG_HOME설정되어 있지 않거나 비어 있으면 $HOME/.config/git/ignore대신 사용됩니다.


5
+1, 나는 이것을 발견 할 때까지 비명을 질렀다. 그런 다음 ... .DS_Store내 하위 모듈 중 하나에서 파일이 자동으로 (OS X에 의해) 생성되어 주요 프로젝트를 저 지르지 못하게 한다는 것을 깨달았다 . 아가! 시간 업데이트 .gitignore...
코트니 크리스텐슨

Xcode를 사용하여 * .xcuserdatad를 .gitignore-global 파일에 추가하는 것도 유용하다는 것을 알았습니다. 이것은 git이 로컬 Xcode 환경 설정을 추적하지 못하게합니다.
Roy Sharon

하위 모듈에 대한 푸시 권한이없는 경우 하위 모듈의 변경 사항을 상위 리포지토리의 다른 사용자와 공유 할 수 없습니다. @quincyglenn의 솔루션은 그러한 경우에 효과가있는 것 같습니다.
Drew Noakes

1
@VonC, 상황과 선호도에 따라 두 가지 대답 모두 의미가 있습니다. 나는 다른 사람들에 대한 참고로서 여기의 차이점을 강조하고 싶었다. 여기 Git에 관한 많은 답변에 대해 BTW 감사합니다.
Drew Noakes

2
.gitignore (자체 추적되지 않음)를 커밋하고 만들지 않고도 할 수 있습니다. 서브 모듈을 열고 .git/info/exclude거기에 ignore 줄을 추가하십시오 (.gitignore처럼 작동하지만 공유 저장소의 일부는 아닙니다).
Martin Pecka

144

블로그 게시물 이 전체적으로 작동한다는 것을 알았 습니다 . 파일 ignore = dirty의 각 항목에 옵션을 추가 .gitmodules합니다.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

쉽게 자동화되므로 선호하는 솔루션입니다.
치명적인 기타

24
ignore = untracked또한 언급 할 가치 가 있으며 수정 된 추적 파일은 표시하지만 추적되지 않은 파일은 표시하지 않습니다. 모든 하위 모듈에 대해이 설정에 대한 전역 설정이 있으면 좋을 것입니다.
naught101

12

각 하위 모듈 디렉토리로 이동하여 분리 된 자식 역할을 할 수도 있습니다. 예를 들면 다음과 같습니다.

cd my/project/submodule
git status

... / 수정 된 파일의 목록을 가져옵니다 /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

당신은 또한 원격 하위 모듈 저장소를 업데이트 할 수 있습니다

git submodule update

아무튼


5
git add .수정 된 파일을 검토 하지 않고 는 원하지 않을 것입니다 . 대부분의 경우, 변경된 내용은 추가 된 .DS_Store파일 .gitignore입니다. 이것은 답변에 대한 첫 번째 주석에서 언급 한 zourtney와 같이 아마도 귀하의 에 의해 잡힐 것입니다.
gregoltsov

실제로 서브 모듈을 업데이트하지 않고 원래 상태로 되돌리려면을 실행하십시오 git submodule update --force.
Tom

4

detached HEAD하위 모듈 브랜치 때문일 수 있습니다 . 이 경우 하위 모듈 경로 (예 :)로 이동 ./bundle/snipmate한 다음을 실행하십시오 git checkout master.


2

어제 12 개의 서브 모듈에 가까운 프로젝트 에서이 문제에 갇혔습니다.

git status 출력을 보여주고 있었다.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

비 추적 콘텐츠 오류를 해결하려면, 나는 모든 서브 모듈에서 비 추적 파일 (모든했다 제거했다 *.pyc, *.pyo사용 a 파이썬에 의해 생성 된 파일) .gitignore.

다른 것을 해결하기 위해 git submodule update각 서브 모듈을 업데이트 한 것을 실행해야했습니다 .


1

내 상황에서 ZF2 환경에서 새 모듈의 시작점으로 모듈을 복제합니다. 이것이하는 일은 디렉토리에 자체 .git 폴더를 넣는 것입니다.

이 경우 해결 방법은 .git 폴더를 삭제하는 것입니다 (숨기려면 파일을 표시해야합니다).


1

이것은 아마도 특정 폴더 안에 다른 .git [숨겨진 폴더]가있을 때 발생합니다.

수정 : ./../ .. (수정 된 내용, 추적되지 않은 내용)

하위 디렉토리에이 .git 폴더가 포함되어 있지 않은지 확인하십시오.

이 경우 하위 디렉토리에서 .git 폴더를 수동으로 삭제하여 문제를 해결할 수 있습니다.


1

SourceTree 을 사용하는 것을 선호 하므로 솔루션은 SourceTree에서 하위 모듈 저장소를 열어 추적되지 않은 모든 파일 목록을 표시하는 것이 었습니다. 그런 다음 그룹을 모두 선택하고 "제거"를 사용했습니다.

추적되지 않은 모든 파일이 실제로 필요하지 않다는 것을 알고 있었기 때문에이 작업을 수행 할 수있었습니다.


1

이것은 나를 위해 잘 작동했습니다.

git update-index --skip-worktree <path>

에서 작동하지 않으면 pathname파일 이름을 사용해보십시오. 이것이 당신에게도 효과가 있는지 알려주세요.


-1

이것이 일시적인 문제인 경우 하위 모듈 폴더로 이동하여 실행할 수 git reset HEAD --hard있지만 하위 모듈 내부의 모든 변경 내용이 손실됩니다.

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