힘내 : 상태, diff 등에서 '수정 된 콘텐츠'/ 더티 하위 모듈 항목의 목록을 억제 할 수 있습니까?


123

언젠가 (1.6.x 릴리스 전후) git이 하위 모듈 내부의 변경 사항을 인식하게되었습니다. 그것은 나를 귀찮게 할뿐입니다.

$ 자식 상태 공급 업체 | grep 수정 :
# 수정 됨 : 공급 업체 / 레일 (수정 된 콘텐츠)
$ git diff vendor /
diff --git a / vendor / rails b / vendor / rails
--- a / 공급 업체 / 레일
+++ b / 공급 업체 / 레일
@@ -1 +1 @@
-서브 프로젝트 커밋 046c900df27994d454b7f906caa0e4226bb42b6f
+ 서브 프로젝트 커밋 046c900df27994d454b7f906caa0e4226bb42b6f-dirty

제발 그만해?

편집하다:

네, 답이 있습니다. 이제 다른 질문이 있습니다.

이거 넣어도 ~/.gitconfig돼요? 내 이니셜부터는 할 수없는 것 같았고 패치를 훑어 보면서 유망한 것을 보지 못했습니다. (나는 여전히 별칭을 만들 수 있다고 생각합니다.)


나는 이것에 관한 git 메일 링리스트에서 2010 년 6 월에 패치 된 것을 볼 수있다. 그래서 다가오는 릴리즈에 있기를 바란다. (Google for 'git "--ignore-submodules = dirty"')
kch

메시지가 발생하는 이유를 설명하는 +1!
dotancohen 2014 년

답변:


175

.gitmodules 파일 내에 추가 된 모든 하위 모듈에 대해 무시 모드를 설정할 수도 있습니다.

바로 오늘이 문제가 발생했고 해결책을 찾은 후 즉시 블로그에 기사를 썼습니다. git 하위 모듈의 변경 사항을 무시하는 방법

요점 :

하위 모듈을 추가하면 .gitmodules저장소의 루트에 이름이 지정된 파일이 있습니다.

해당 .gitmodules파일 에 한 줄만 추가하면 됩니다.

[submodule "bundle/fugitive"]
    path = bundle/fugitive
    url = git://github.com/tpope/vim-fugitive.git
    ignore = dirty

5
+1, 그러나 나는 귀하의 답변에 대한 귀하의 블로그 게시물의 주요 부분을 포함했습니다 : 귀하의 외부 링크는 영원히 살 수있는 SO 답변과 달리 언젠가 무효가 될 수 있습니다 (SO 덤프를 통해 : blog.stackoverflow.com/2009/ 06 /… )
VonC 2012

5
git status예상대로 작동 하기 전에 .gitmodules 파일을 커밋해야한다는 것을 알았습니다 . 또한 적어도 1.7.4 이상이 필요하다고 생각합니다.
aleemb

를 들어 .gitignore파일,라는 개인 버전이 exclude에있는 .git/info/버전 처리되지 않습니다. 파일에 해당하는 파일이 있습니까?이 파일을 .gitmodules변경하지 않고 부모 저장소의 인스턴스에서만 하위 모듈의 변경을 억제 할 수 있습니다 .gitmodules.
HelloGoodbye

2
분기를 추적하는 하위 모듈과 함께 작동하도록 할 수 없습니다. 그것은 지원되지 않습니까? ```[서브 모듈 "smstack / ansible / 호스트"] 경로 = smstack / ansible / 호스트 URL = https : //로 ... 지점 = 마스터가 무시 = 더러운``````
마크 아브라모 위츠

1
@MarcAbramowitz 나는 내가 생각하는 것과 같은 문제를 우연히 발견했습니다-이것에 대한 해결책을 찾았습니까?
Sebastian G. Marinescu

61

억제 할 수있는 두 가지 종류의 변경 공지가 있습니다.

첫 번째는 untracked content서브 모듈을 변경했지만 아직 커밋하지 않았을 때 발생합니다. 상위 저장소는이를 인식하고 git status그에 따라보고합니다.

modified: modules/media (untracked content)

다음을 사용하여이를 억제 할 수 있습니다.

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = dirty

그러나 이러한 변경 사항을 커밋하면 상위 저장소가 다시 한 번 알림을 받고 그에 따라보고합니다.

modified:   modules/media (new commits)

이것도 억제하려면 all변경 사항 을 무시해야합니다.

[submodule "modules/media"]
   path = modules/media
   url = git@github.com:user/media.git
   ignore = all

2
를 들어 .gitignore파일,라는 개인 버전이 exclude에있는 .git/info/버전 처리되지 않습니다. 파일에 해당하는 파일이 있습니까?이 파일을 .gitmodules변경하지 않고 부모 저장소의 인스턴스에서만 하위 모듈의 변경을 억제 할 수 있습니다 .gitmodules.
HelloGoodbye

1
HelloGoodbye : .git / modules / $ MODULENAME /을 확인하면 해당 모듈의 .git 디렉토리가 무엇인지 확인할 수 있습니다. 해당 위치에서 정보 / 제외 파일을 변경하면 작업이 수행됩니다.
PaulW 2015

1
ignore = all부분은 유용합니다.
에릭 왕

53

업데이트 : 주어진 하위 모듈의 더티 상태를 무시하기 위해 구성 매개 변수를 파일 에 추가 할 수 있는지에 대한 nilshaldenwang답변을 참조하십시오 .gitmodules.

ignore = dirty

그래서 1.7.2가 발생한 경우와 포함 이눔 --ignore-submodules에 대한 옵션을 status.

에서 git help status:

--ignore-submodules [= <언제>]
    변경 사항을 찾을 때 하위 모듈의 변경 사항을 무시하십시오.
    <when>은 "untracked", "dirty"또는 "all"일 수 있습니다.
    기본값입니다. "추적되지 않음"이 사용되는 경우 하위 모듈은
    추적되지 않은 항목 만 포함하는 경우 더러운 것으로 간주되지 않습니다.
    콘텐츠 (하지만 수정 된 콘텐츠에 대해서는 여전히 스캔 됨).
    "dirty"를 사용하면 작업 트리에 대한 모든 변경 사항이 무시됩니다.
    하위 모듈에 저장된 커밋의 변경 사항 만
    슈퍼 프로젝트가 표시됩니다 (이전의 동작이었습니다.
    1.7.0). "all"을 사용하면 하위 모듈에 대한 모든 변경 사항을 숨 깁니다.
    서브 모듈 요약의 출력을 억제합니다.
    구성 옵션 status.submodulesummary가 설정 됨).

내가 원하는 값은 dirty입니다.

git status --ignore-submodules=dirty

게으 르기 때문에 별칭을 사용합니다.

alias gst='git status --ignore-submodules=dirty'

2
이것은 허용되는 답변이므로 여기 ignore=dirty.gitmodules파일의 개별 항목에 추가하는 옵션도 추가해야한다고 생각합니다 .
Andriy Drozdyuk 2012

14

언급했듯이 patch git submodule : ignore dirty submodules for summary and status is in making.

Git 1.7.2-rc2 릴리스 에서도 발표 되었습니다.

Git v1.7.2 Release Notes (draft)
================================

Updates since v1.7.1
--------------------

" git status"학습 된 " --ignore-submodules"옵션.

의미:

git config --global diff.ignoreSubmodules dirty

이것을 옵션으로 고려하는 것은 현재 선택된 접근 방식 이 아닙니다 .

이 시리즈 이후에 구성 옵션 ' ignore'을 에 추가 할 계획 .gitmodules입니다. 각 하위 모듈에 대해 "all", "dirty", "untracked"또는 "none"(기본값)으로 설정할 수 있습니다.

" git diff"및 " git status"는 각 하위 모듈에 대해 해당 구성 값을 사용합니다.
" --ignore-submodule"을 사용하면 이 기본값이 재정의됩니다 (구성 설정을 재정의 할 수 있도록 새 매개 변수 "none"이 여기에 추가됨).

git submdule sync옵션이 변경 될 때마다 " " 을 (를) 수행 할 필요가 없도록 .git/config먼저 검색하고 싶습니다 .
여기에서 찾을 수없는 .gitmodules경우 에서 가져옵니다 (있는 경우).

따라서 사용자는 설정을 재정의 할 수 있지만 그렇지 않은 경우 업스트림에서 쉽게 변경할 수 있습니다 (예 : 하위 모듈 .gitignore이 업데이트되어 " ignore=untracked"이 더 이상 필요하지 않도록 제거 할 수 있음).
또한 분기간에 ' ignore'항목 .gitmodules이 다른 경우 분기를 전환하면 즉시 효과가 나타납니다 .


Git 2.13 (2017 년 2 분기)에서는 특정 하위 모듈을 무시하도록 git 상태 (또는 모든 git 명령)를 만드는 또 다른 방법을 사용할 수 있습니다.

git config submodule.<name>.active false

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


gitconfig 비트로 질문을 업데이트했습니다. 답을 안다면 그냥 핑을하세요.
kch 2010-07-13

@kch : 현재 이러한 종류의 설정을 저장하기 위해 제안 된 접근 방식으로 답변을 업데이트했습니다.
VonC

@drozzy : 다른 댓글에서 언급했듯이 : " ignore = dirty"
VonC

1
@drozzy : 추가 구성 매개 변수 "ignore = dirty"로 nilshaldenwang의 답변을 upvoted하고 완료했습니다. 공식 답변을 편집하여 nilshaldenwang의 게시물에 대한 링크를 추가했습니다.
VonC 2012

감사합니다. 개인적인 것은 아니지만, 처음에는 놓친 더 유용한 답변을 원했습니다.
Andriy Drozdyuk 2012

11

당신은 또한 사용할 수 있습니다

% git config [--global] submodule.ignore dirty

설정 submodule.ignore = dirty당신의 .git/config파일. --global무시 플래그를 설정하고 ~/.gitconfig모든 저장소에 적용합니다. 그것 없이는 .git/config현재 당신이있는 repo 에 대해 설정되어야합니다 .

여기 submodule.<name>.ignore에서 찾을 수있는 유일한 문서 는 git-config docs 입니다. .gitmodules 파일에서 ~ / .gitconfig로 옮겼는데 여전히 작동 중입니다.


@ PawełGościcki Git 2.0.0에서 작동하는지 확인할 수 있습니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

6

추가해야합니다.

무시 = 더러운

.gitmodules로


.gitmodules의 어디에 추가합니까?
Andriy Drozdyuk 2012

@drozzy "path"및 "url"값이 정의 된 무시하려는 각 하위 모듈의 섹션 아래에 추가합니다.
jsdalton

2

그래서 git v1.7.2-rc2에는 내가 원하는 것이 있습니다.

$ git diff --ignore-submodules = dirty vendor
# 출력 없음
$ git status --ignore-submodules = dirty vendor
# 지점에서…
커밋 할 항목 없음 (작업 디렉터리 정리)

나만의 git howto 빌드 :

# get git
git clone git://git.kernel.org/pub/scm/git/git.git git
cd git
git checkout v1.7.2-rc2

# make git. beware of setting prefix
make configure
./configure --prefix=/usr/local
make
sudo make install

# you REALLY don't want to `make doc`, use this instead
sudo make quick-install-man
sudo make quick-install-html

1
나는 여기에 7 개의 힘을 세었다 : git clone git://git.kernel.org/pub/scm/git/git.git git.
dotancohen

2

나는이 질문에 대답했습니다 여기에 상세하게.

그냥 달려

git config --global diff.ignoreSubmodules dirty

이러한 변경 사항을 무시하는 로컬 구성 옵션을 추가합니다.


1

당신은 추가 할 수 없습니다 ignore = dirty.gitmodules, 당신은 무시하고 싶다고 변경 사항에 대한 자세한 선택적으로 할 수 있습니다.

에이를 위해 패턴을 추가 할 .git/submodule_foo/bar/info/exclude경우, submodule_foo/bar/서브 모듈의 경로입니다.

패턴은에 추가 할 패턴과 유사 .gitignore하며 루트가 하위 모듈 디렉토리입니다. 예를 들어이 패턴은 build하위 모듈 의 디렉토리를 무시합니다 submodule_foo/bar/.

# in .git/submodule_foo/bar/info/exclude:
/build/

3
나는 이것이 서브 모듈 내부에서도 변경 사항을 숨길 것이라고 생각합니다. 하위 모듈 외부에서만 변경 사항을 숨기고 싶습니다. 내가 서브 모듈을 적극적으로 작업 할 때 내부에 표시되면 괜찮습니다.
Raphael Schweikert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.