IT story

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

hot-time 2020. 5. 5. 19:37
반응형

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


방금 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

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


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

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

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

다음과 같이 수정하면됩니다.

  • 부모 repo로 돌아 가기 전에 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

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


편집 :이 답변 (및 대부분의 다른 답변)은 더 이상 사용되지 않습니다. 대신 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커밋도 무시합니다. 모든 하위 모듈에 와일드 카드를 사용하는 방법은 없습니다.


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


git submodule foreach --recursive git checkout .

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

그래서 서브 모듈로 향할 수 있었고 git status는 내 HEAD가 분리되었음을 보여주었습니다-git checkout master, git status 수정 된 파일을 다시 한 번 git checkout> filename <, git pull 및 모든 것이 다시 잘 나타납니다.


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

git config --global diff.ignoreSubmodules dirty

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

[diff]
  ignoreSubmodules = dirty

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


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

To disable filemode in a submodule, you can edit /.git/modules/path/to/your/submodule/config and add

[core]
  filemode = false

If you want to ignore all dirty states, you can either set ignore = dirty property in /.gitmodules file, but I think it's better to only disable filemode.


I ended up removing the submodule directory and initializing it once again

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

In my case I wasn't sure what had caused this to happen, but I knew I just wanted the submodules to be reset to their latest remote commit and be done with it. This involved combining answers from a couple of different questions on here:

git submodule update --recursive --remote --init

Sources:

How do I revert my changes to a git submodule?

Easy way to pull latest of all git submodules

참고URL : https://stackoverflow.com/questions/4873980/git-diff-says-subproject-is-dirty

반응형