Git diff는 하위 프로젝트가 더럽다고 말합니다.


227

방금 git diff를 실행했으며 약 10 개의 하위 모듈 모두에 대해 다음과 같은 결과가 나타납니다.

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

이것은 무엇을 의미 하는가? 어떻게 고치나요?

답변:


268

마크 Longair의 블로그 게시물에서 언급 한 바와 같이 망할 놈의 서브 모듈은 설명했다 ,

git 버전 1.7.0 이상에는 git 서브 모듈의 동작에 성가신 변화 가 포함되어 있습니다 .
서브 모듈은 수정 된 파일이나 추적되지 않은 파일이있는 경우 더티로 간주 되지만 이전에는 서브 모듈의 HEAD가 잘못된 커밋을 가리키는 경우에만 해당됩니다.

+git 서브 모듈의 출력에서 더하기 부호 ( ) 의 의미 가 변경되었으며, 이것을 처음 접했을 때 변경 로그를 보거나 git에서 git bisect를 사용하여 무엇이 잘못되었는지 파악하는 데 약간의 시간이 걸립니다. .git에서 변경 사항을 찾으십시오. “지정된 버전에서는 더럽지 만”이라는 다른 기호를 사용하는 것이 사용자에게 훨씬 더 친절했을 것입니다.

다음 방법으로 문제를 해결할 수 있습니다.

  • 부모 리포지토리로 돌아 가기 전에 각 하위 모듈 내에서 변경 / 진화를 커밋하거나 취소합니다 (diff가 더 이상 "더러운"파일을보고하지 않아야 함). 서브 모듈의 모든 변경 사항을 서브 모듈 cd의 루트 디렉토리로 되돌리려면git checkout .

    dotnetCarpenter는 코멘트 당신이 할 수 있다고 :git submodule foreach --recursive git checkout .

  • 또는 "더러운"하위 모듈을 일시적으로 무시하려면을 추가 --ignore-submodules하십시오 git diff.

Git 버전 1.7.2의 새로운 기능

으로 노암는 아래의 코멘트 , 이 질문은 Git 버전 1.7.2 이후, 당신은 더러운 서브 모듈을 함께 무시할 수, 그 언급 :

git status --ignore-submodules=dirty

2
또한 알아 두어야 할 좋은 점 : git commit -a이러한 변경 사항을 추가하지 않아도 exec 을 실행할 수 있습니다 . M앞면에 표시되어 있지만 커밋으로 끝나지 않습니다.
gitaarik

1
나를 위해, 나는 각각의 더티 서브 모듈로 가서 실행해야했습니다 git clean -id.
GDP2

1
@ GDP2 한 줄에 넣을 수 git submodule foreach --recursive git clean -id있는 (백업 저장소에서 먼저 테스트);
VonC

1
내가 이것을 계속 설명 할 수없는 경우, 서브 모듈에없는 파일을 추적 할 수 없다는 것이 발생했습니다 .gitignore. 거기 또는 내 전역 무시 목록에 추가하면 문제가 해결됩니다.
Ben

21

또한, 서브 모듈을 제거하고 실행 git submodule init하고 git submodule update분명 트릭을 할 것입니다,하지만 항상 적절하거나 가능하지 않을 수 있습니다.


1
기존 폴더를 하위 모듈로 변환 한 다음 여전히 이전 폴더가있는 다른 컴퓨터로 가져 왔을 때 유용했습니다.
Roger Lipscombe

18

하위 모듈에서 추적되지 않은 모든 파일을 무시하려면 다음 명령을 사용하여 해당 변경 사항을 무시하십시오.

git config --global diff.ignoreSubmodules dirty

로컬 git 구성에 다음 구성 옵션이 추가됩니다.

[diff]
  ignoreSubmodules = dirty

자세한 내용은 여기를 참조하십시오


16

편집 :이 답변 (및 대부분의 다른 답변)은 더 이상 사용되지 않습니다. 대신 Devpool의 답변을 참조하십시오 .


원래 " git diff --ignore-submodules"및 " git status --ignore-submodules"를 전역 기본값으로 설정하는 구성 옵션이 없었습니다 (그러나 명령에 git 기본 플래그 설정 참조 ). 대안은 디폴트 설정하는 것입니다 ignore당신이 (모두 무시하려는 각 개별 서브 모듈에 대한 설정 옵션 git diffgit status중 하나에) .git/config파일 (로컬 전용) 또는 .gitmodules(자식에 의해 버전이 될 것이다). 예를 들면 다음과 같습니다.

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untracked추적되지 않은 파일 만 ignore = dirty무시하고 수정 된 파일도 무시하고 ignore = all커밋도 무시합니다. 모든 하위 모듈에 와일드 카드를 사용하는 방법은 없습니다.


13

서브 모듈에 대한 포인터가 실제로 서브 모듈 디렉토리에있는 것이 아니기 때문입니다. 이 문제를 해결하려면 git submodule update다시 실행해야 합니다.


9
git submodule foreach --recursive git checkout .

이것은 나를 위해 속임수를 쓰지 않았지만 서브 모듈에서 변경된 파일 목록 (내 경우에는 아무것도하지 않음)을 나에게주었습니다.

그래서 나는 서브 모듈로 향할 수 있었고 git status는 내 HEAD가 분리되었음을 보여 주었다.


9

하위 모듈 디렉토리를 제거하고 다시 한 번 초기화했습니다.

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
차라리 무슨 일이 일어 났는지 이해하고
싶었지만

6

파일 모드 설정이 활성화되어 있고 하위 모듈 하위 트리에서 파일 권한을 변경 한 경우 하위 모듈이 더티로 표시 될 수 있습니다.

하위 모듈에서 파일 모드를 비활성화하려면 /.git/modules/path/to/your/submodule/config 를 편집 하고 추가 할 수 있습니다

[core]
  filemode = false

더티 상태를 모두 무시하려면 /.gitmodules 파일 ignore = dirty에서 속성을 설정할 수 있지만 파일 모드 만 비활성화하는 것이 좋습니다.


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