git 하위 모듈에 대한 새 커밋 무시


82

배경

Linux에서 Git 1.8.1.1 사용. 저장소는 다음과 같습니다.

master
  book

하위 모듈은 다음과 같이 생성되었습니다.

$ cd /path/to/master
$ git submodule add https://user@bitbucket.org/user/repo.git book

book서브 모듈은 깨끗합니다 :

$ cd /path/to/master/book/
$ git status
# On branch master
nothing to commit, working directory clean

문제

반면 마스터는 book 서브 모듈에 대한 "새로운 커밋"이 있음을 보여줍니다.

$ cd /path/to/master/
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   book (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")

Git은 하위 모듈 디렉토리를 완전히 무시해야 마스터도 깨끗합니다.

$ cd /path/to/master/
$ git status
# On branch master
nothing to commit, working directory clean

실패한 시도 # 1-더티

master/.gitmodules답변에 따라 파일 내부는 다음과 같습니다 .

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = dirty

실패한 시도 # 2-추적되지 않음

master/.gitmodules답변 에 따라 다음으로 변경 되었습니다 .

[submodule "book"]
        path = book
        url = https://user@bitbucket.org/user/repo.git
        ignore = untracked

실패한 시도 # 3-showUntrackedFiles

master/.git/config답변 에 따라 다음과 같이 편집 되었습니다 .

[status]
   showUntrackedFiles = no

실패한 시도 # 4-무시

마스터 무시 파일에 책 디렉토리를 추가했습니다.

$ cd /path/to/master/
$ echo book > .gitignore

실패한 시도 # 5-복제

다음과 같이 마스터에 책 디렉토리를 추가했습니다.

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book

질문

어떻게 수있는 book서브 모듈은 아래 자신의 저장소 디렉토리에 master저장소 아직 무시 GIT이 book서브 모듈을? 즉, 다음이 표시되지 않아야합니다.

#
#       modified:   book (new commits)
#

git status마스터 저장소에서 실행할 때 해당 메시지를 억제하는 방법은 무엇입니까?

git 하위 모듈 함정 에 대한 기사 에서 부적절한 하위 모듈 사용을 제안합니까?


3
저장소를 다른 저장소의 특정 버전에 연결하고이를 추적하려는 경우 일반적으로 하위 모듈을 사용합니다. 그러나 그것은 당신이 원하는 것 같지 않습니다. 추적하지 않고 다른 저장소 내부의 저장소를 사용하고 싶습니다. 그런 다음 하위 모듈로 추가하지 마십시오.
Felix Kling 2013 년

@FelixKling, 그런 방식으로 이러한 저장소를 추가하고 GitHub에 푸시하면 해당 폴더의 내용을 복사하지 않고 링크 만 만들 수 있습니까?
Roman Bekkiev 2013

@Roland : 하위 모듈은 다른 저장소의 버전에 대한 참조가있는 파일입니다. 저장소의 로컬 복사본에서 초기화되면 저장소의 실제 콘텐츠로 대체됩니다.
Felix Kling 2013

2
나는 당신이 "= 모든 무시"를 찾고 생각
greuze

1
Git 2.13 (2017 년 2 분기)에서는 git config submodule.<name>.active false. 아래 내 대답을
VonC

답변:


59

수퍼 저장소에서 추적 할 필요가없는 다른 저장소를 포함하려면 다음을 시도하십시오.

$ cd /path/to/master/
$ rm -rf book
$ git clone https://user@bitbucket.org/user/repo.git book
$ git add book
$ echo "book" >> .gitignore

그런 다음 커밋하십시오.

링크 된 git 하위 모듈 함정 기사에 명시된대로 :

... 부모와 서브 모듈 사이의 유일한 연결은 부모의 커밋에 저장되는 서브 모듈의 체크 아웃 된 SHA의 기록 된 값입니다.

즉, 서브 모듈은 체크 아웃 된 브랜치 나 태그에 의해 저장되지 않고 항상 특정 커밋에 의해 저장됩니다. 해당 커밋 (SHA)은 일반 텍스트 파일 (물론 그러한 참조로 표시됨)과 같이 수퍼 저장소 (서브 모듈을 포함하는 것)에 저장됩니다.

서브 모듈에서 다른 커밋을 확인 하거나 새 커밋을 수행하면 수퍼 리포지토리에서 체크 아웃 된 SHA가 변경되었음을 알 수 있습니다. 의는 당신이 얻을 때 modified (new commits)에서 줄을 git status.

이를 제거하려면 다음 중 하나를 수행하십시오.

  • git submodule update, 하위 모듈을 현재 수퍼 저장소에 저장된 커밋으로 재설정합니다 (자세한 내용 git submodule맨 페이지 참조 ; 또는
  • git add book && git commit 새 SHA를 슈퍼 저장소에 저장합니다.

주석에서 언급했듯이 book하위 모듈을 버리는 것을 고려 하십시오. 수퍼 저장소의 일부로 상태를 추적 할 필요가없는 경우 수퍼 저장소 내부에서 복제하십시오.


3
와, 이제 슈퍼 모듈이 서브 모듈의 버전을 알아야 하는지 이해 합니다. 물론 git add book && git commit. git이 실제로 두 저장소가 동기화되어 있는지 확인할 수 있다는 것을 몰랐습니다.
Sergey Orshanskiy

101

그냥 실행 :

$ git submodule update

그러면 상위 저장소를 최신 버전의 하위 모듈로 업데이트하지 않고 하위 모듈을 이전 커밋 (parent-repo에 지정됨)으로 되돌립니다.


6
아니요, 상태를 변경하지 않습니다.
Ed Bishop

OP 가 저장소 의 최신 정보를 원하지 않는 이유는 무엇 book입니까? 이 맥락에서 귀하의 대답이 의미가 없다고 생각합니다.
Alexis Wilke 2017

@AlexisWilke와 책 인터페이스가 극적으로 변경되고 OP가 마스터 리포지토리를 변경할 시간이 없다면?
Logman

이것이 제가 찾던 답입니다!
LLSv2.0

21

억제 할 수있는 변경 공지에는 두 종류가 있습니다 (git 1.7.2부터).

첫 번째는 하위 모듈을 변경했지만 아직 커밋하지 않은 경우 발생하는 추적되지 않은 콘텐츠입니다. 상위 저장소는이를 인식하고 git 상태는 이에 따라보고합니다.

modified: book (untracked content)

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

[submodule "book"]
    path = modules/media
    url = https://user@bitbucket.org/user/repo.git
    ignore = dirty

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

modified:   book (new commits)

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

[submodule "book"]
    path = book
    url = https://user@bitbucket.org/user/repo.git
    ignore = all

ignore = all모든 하위 모듈 에 옵션을 추가했다고 상상해보십시오 . 결국 일부 모듈에는 푸시 된 새 커밋이 있습니다. 누군가 슈퍼 저장소를 복제하면 하위 모듈의 이전 상태에 있을까요 아니면 최신 하위 모듈을 체크 아웃할까요?
FelikZ

명령 git clone --recursive git@...을 사용하면 하위 모듈의 이전 상태를 얻을 수 있습니다. 업데이트하려면 git submodule foreach "git pull"복제 후 와 같은 것이 필요합니다.
greuze

1
불행히도 ignore = all옵션은 하위 모듈의 새 커밋을 무시하지 않습니다. git 버전 1.7.1을 실행하고 있습니다. 어떤 방법은?
Romulus

10

Git 2.13 (Q2 2017)은 상위 저장소에서 추적 할 필요가없는 하위 모듈을 포함하는 또 다른 방법을 추가합니다.

OP의 경우 :

git config submodule.<name>.active false

참조 1b614c0 커밋 , 1f8d711 커밋 , bb62e0a 커밋 , 3e7eaed 커밋 , a086f92 커밋 (2017년 3월 17일을), 및 ee92ab9 커밋 , 25b31f1 커밋 , e7849a9 커밋 , 6dc9f01 커밋 , 5c2bd8b 커밋 에 의해 (2017 3월 16일) 브랜든 윌리엄스 ( mbrandonw) .
(Merged by Junio ​​C gitsterHamano -- in commit a93dcb0 , 30 Mar 2017)

submodule: URL 및 하위 모듈 관심 분리

현재 submodule.<name>.urlconfig 옵션은 주어진 서브 모듈이 사용자에게 관심이 있는지 확인하는 데 사용됩니다. 이것은 우리가 다른 작업 트리에서 다른 하위 모듈을 체크 아웃하거나 관심있는 하위 모듈을 선택하는보다 일반화 된 메커니즘을 원하는 세상에서 번거 롭습니다.

향후 하위 모듈에 대한 작업 트리 지원을 통해 여러 작업 트리가있을 것입니다. 각 작업 트리는 체크 아웃 된 하위 모듈의 하위 집합 만 필요할 수 있습니다.
URL (서브 모듈 저장소를 얻을 수있는 위치)은 작업 트리마다 다르지 않아야합니다.

또한 사용자가 git submodule init <path>작업 트리에서 체크 아웃하려는 각 하위 모듈 에서 " " 를 실행하는 대신 관심있는 하위 모듈 그룹을보다 쉽게 ​​지정하는 것이 편리 할 수 ​​있습니다 .

이를 위해 두 가지 설정 옵션이 소개되어 submodule.activesubmodule.<name>.active.

  • submodule.active설정은 서브 모듈은 작업 트리에 존재해야 지정하는하는 pathspec을 보유하고 있습니다.
    • submodule.<name>.active설정은 특정 서브 모듈은 작업 트리에 존재하는 경우는 표시하는 데 사용 부울 플래그입니다.

submodule.activepathspec을 사용하기 때문에 다른 구성 옵션과 다르게 작동 한다는 점에 유의하는 것이 중요합니다 .
이를 통해 사용자는 최소한 두 가지 새로운 워크 플로를 채택 할 수 있습니다.

  1. 하위 모듈은 선행 디렉토리로 그룹화 할 수 있습니다. 예를 들어 ' lib/' 와 같은 경로 지정 은 모든 라이브러리 모듈을 포함하여 라이브러리 모듈에 관심이있는 사용자가 " submodule.active = lib/"를 한 번만 설정 하여 ' lib/'의 모든 모듈이 다음과 같이 말할 수 있도록합니다. 흥미 롭군요.
  2. pathspec-attribute 기능이 발명되면 사용자는 속성을 사용하여 하위 모듈에 레이블을 지정하여 그룹화 할 수 있으므로 속성 요구 사항이있는 광범위한 경로 지정 (예 : ' :(attr:lib)')을 사용하여 ' lib'속성을 가진 모든 모듈 이 흥미 롭다고 말할 수 있습니다 .
    때문에 .gitattributes파일, 바로 같은 .gitmodulessuperproject 트리에서 서브 모듈 이동, 프로젝트의 속성을 얻을 수있는 경로를 조정할 수 있습니다 때 파일의 superproject에 의해 추적 .gitattributes이의 서브 모듈이있는 경로 조정할 수 있습니다처럼 .gitmodules.

<name>기존 프로젝트에서 하위 모듈에 대한 정확한 정보를 찾는 방법은 무엇입니까?
ideasman42

@ ideasman42 .gitmodules의 구성을 읽는 것이 도움이 될 것입니다. stackoverflow.com/a/12641787/6309
VonC

아, 그것은에서 불과 값입니다 .git/config> -[submodule "<name>"]
ideasman42

1
나를 위해 일하지 않습니다. 내가하는 일은 다음과 같다 : 1) git clone with --recursive; 2) git config를 대답으로 설정하십시오. 3) git checkout, git pull to checkout last submodule; 여전히 "(new commits)"를 얻습니다.
Wu Baiquan

2
@VonC 메시지를 보내기 전에 두 경우 모두 작동하지 않았습니다 (기존 repo 및 새로 초기화 된 repo 사용).
Porcupine

3

Nevik Rehnel 대답은 ​​확실히 당신이 요구하는 것에 대한 올바른 대답입니다. 나는 서브 모듈을 갖고 싶지 않았고, 어떻게 그 상황에서 벗어날 수 있습니까 ?! .

master프로젝트에 book하위 모듈이 필요한 경우에만 프로젝트 를 체크 아웃 한 다른 사용자 git가 실행할 특별한 명령이 없는 것을 즐길 수 있기 때문에 그대로 유지하는 것이 좋습니다 (음 ... 사용할 특별한 명령이 있습니다. 하위 모듈이지만 전반적으로 관리하는 것이 여전히 더 간단하다고 생각합니다.)

귀하의 경우에는 book저장소 에서 변경 하고 어느 시점에서 이러한 변경 사항을 커밋합니다. 즉 , 해당 하위 모듈에 새 SHA1 참조가있는 새 커밋 이 있습니다.

마스터 디렉토리에서해야 할 일은 마스터 리포지토리에서 변경 사항을 커밋하는 것입니다.

cd /path/to/master
git commit . -m "Update 'book' in master"

그러면 저장소 master에서 사용 가능한 최신 버전으로 SHA1 참조가 업데이트됩니다 book. 결과적으로이 커밋을 통해 다른 사람들 이 팁에서 모든 master& book저장소 를 체크 아웃 할 수 있습니다 .

따라서 사실상 하위 모듈을 변경할 때마다 한 번 더 커밋하게됩니다. master동시에 둘 다 커밋하기 때문에 저장소의 일부 파일도 변경하면 반투명합니다 .


-5

운영

git submodule update 

루트 수준에서.


궁금한 사람을 위해. 제 경우에는 (그리고 OP?) 이것은 git status말하는 내용을 변경하지 않습니다 . 여전히 변화가 일어났다 고 생각합니다.
squarism

그것은 클론 기타의 답변에 아주 나쁜 방법입니다
맥심
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.