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

배경

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 하위 모듈 함정 에 대한 기사 에서 부적절한 하위 모듈 사용을 제안합니까?



답변

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

$ 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하위 모듈을 버리는 것을 고려 하십시오. 수퍼 저장소의 일부로 상태를 추적 할 필요가없는 경우 수퍼 저장소 내부에서 복제하십시오.


답변

그냥 실행 :

$ git submodule update

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


답변

억제 할 수있는 변경 공지에는 두 종류가 있습니다 (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


답변

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.active
submodule.<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.


답변

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

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

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

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

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

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

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


답변

운영

git submodule update

루트 수준에서.


답변