git pull이 자동으로 서브 모듈을 업데이트하는 방법이 있습니까?


203

자동이 할 수있는 방법이 git submodule update바람직 (또는 git submodule update --init때마다 호출 git pull완료?

git config 설정 또는 git alias를 찾으십시오.



1
왜 git alias가 쉘 alias보다 선호됩니까?
— wnoise

20
git aliases는 "git"네임 스페이스에서 명령을 캡슐화하기 때문에 좋습니다. 왜 모든 git 명령이 자신의 이름 대신 "git"으로 시작하는지 묻습니다.
— 릴리 발라드

5
이것을 찾는 사람이라면, 투표율이 높은 답변은 현재 구식입니다. 케인의 대답은 정확합니다 : stackoverflow.com/a/49427199/3499424
— John Neuhaus

답변:


176

현재 힘내 2.14 , 당신은 사용할 수 있습니다 git pull --recurse-submodules(이것은 당신이 원하는대로 및 별칭).

현재 힘내 2.15 , 당신은 설정할 수 있습니다submodule.recurse 원하는 동작을 사용하려면 true로.

다음을 실행하여 전 세계적으로이 작업을 수행 할 수 있습니다.

git config --global submodule.recurse true

3
2.16으로 확인되면이 값을 true로 설정하면 git pull하위 모듈을 가져 와서 실행 submodule update합니다. 이것은 실제로 받아 들여질 필요가 있습니다
— John Neuhaus

1
이것을 전 세계적으로 설정하려면 :git config --global submodule.recurse true
— wintersolutions

14
나는 서브 모듈에 좌절했다. 이제 그들은 내가 기대하는 것처럼 작동합니다. 이것이 기본 동작이 아니라고 생각하지 않는 이유가 있습니까?
— Ben

9
그들은 그것을 가능하게해야 git clone합니다. 기본적으로 설정하십시오. 그렇지 않으면, 항상 사람들의 모듈은 항상 :-( 동기의 나가로, 서브 모듈을 사용하여 큰 저항이있을 것이다
— 치로 틸리郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件틸리 자식 명령 (등 commit, fetch, pull등)은 현재 저장소에 적용되도록 설계된다. 하위 모듈은 다른 저장소이므로 기본적으로 부모 저장소에서 실행되는 명령의 영향을받지 않아야합니다. 이것은 git-developer에 의한 일종의 디자인 결정입니다.
— 음이온

113

git config --global alias.pullall '!git pull && git submodule update --init --recursive'

인수를 git pull에 전달하려면 대신 이것을 사용하십시오.

git config --global alias.pullall '!f(){ git pull "$@" && git submodule update --init --recursive; }; f'

4
사용하는 모든 git repos에서이 별칭을 원하면 "git config --global"을 사용하십시오.
— yoyo

43

Git 1.7.5부터는 원하는대로 기본적으로 서브 모듈을 자동으로 업데이트해야합니다.

[편집 : 코멘트를 : 새로운 1.7.5 동작은 자동으로하는 것입니다 가져 서브 모듈의 최신 커밋을하지만, 하지 에 업데이트 그들을합니다 (의 git submodule update의미). 따라서이 답변의 정보는 배경과 관련이 있지만 완전한 답변은 아닙니다. 하나의 명령으로 하위 모듈을 가져오고 업데이트하려면 여전히 별칭이 필요합니다.]

기본 동작 인 "주문형"은 하위 모듈 커밋을 업데이트하는 커밋을 가져올 때마다 하위 모듈을 업데이트하는 것이며이 커밋은 로컬 클론에 아직 없습니다.
또한 모든 페치에서 업데이트하거나 절대 (1.7.5 이전 동작으로 가정) 할 수 있습니다.
이 동작을 변경하는 구성 옵션은 fetch.recurseSubmodules입니다.

이 옵션은 부울 값 또는으로 설정할 수 있습니다 on-demand.
부울로 설정하면 동작 변경 fetch및 pull서브 모듈로 무조건 같이 Recurse false로 전혀 사실에 대한 여부를 같이 Recurse로 설정 세트를.

시에 설정 on-demand(기본값), fetch및 pull 단지 같이 Recurse 채워진 서브 모듈로의 superproject가 검색 할 때 해당 업데이트 서브 모듈의 참조를 커밋합니다 .

보다:

자세한 내용은.

git fetch --recurse-submodules[=yes|on-demand|no]

27
조심하십시오 : 아래 답변에서 설명하는 것처럼 변경 사항을 자동으로 가져 오므로 하위 모듈 업데이트를 수행해야하므로 별칭 답변이 옳습니다.
— Artem

4
@Artem이 맞습니다. 이 답변은 유용하지만 전체 질문을 다루지는 않습니다. 이 설정은 단순히 a git fetch가 아닌을 수행 합니다 git submodule update.
— Andrew Ferrier

2
이 답변은 매우 기만적입니다. git pull대신 git fetch이 옵션을 사용하더라도 가져 오기는 재귀 적입니다. 서브 모듈에서 체크 아웃 된 커밋은 전혀 변경되지 않습니다. 그래서git submodule update @Artem에서 언급 한 바와 같이, 여전히 필요하다.
— Mark Amery 10

31

아무도이 작업을 수행하기 위해 자식 후크를 사용하는 것에 대해 언급하지 않았습니다.

이름이 지정된 파일 post-checkout과 관련 리포지토리 post-merge의 .git/hooks디렉토리에 파일을 추가 하고 다음을 각 파일에 넣습니다.

#!/bin/sh
git submodule update --init --recursive

별명을 구체적으로 요구했기 때문에 많은 저장소에 대해 별명을 원한다고 가정하면 별명을 작성하여이를 저장소에 추가 할 수 있습니다 .git/hooks.


2
이것을 세계적인 환경으로 만들 수있는 방법이 있습니까? 또는 저장소를 체크 아웃 할 때 자동으로 제공됩니까?
— Raoul Steffen

3
git 2.9의 최신 릴리스 에는 hooks directory 라는 이름의 설정core.hooksPath 이 추가되었습니다git-config . 자세한 내용 은 문서 를 참조하십시오.
— taleinat

1
체크 아웃 할 때 자동으로 수신 된 것에 관해서는 검색했지만 일종의 것을 찾을 수 없었습니다. 한 소스는 이것이 보안 문제에 대해 의도적으로 지원되지 않는다고 언급했습니다. 클라이언트 시스템에서 임의의 코드를 실행하는 데 쉽게 사용될 수 있기 때문입니다.
— taleinat

1
이것이 보안 문제가 될 수있는 방법을 봅니다. 결국 동료의 컴퓨터에서 지시하지 않고 프로그램을 실행하는 데 코드를 사용하고 싶습니다.
— Raoul Steffen

1
이 솔루션은 처음 생각했지만 다음을 사용하는 사람들에게는 적용되지 않는다는 것을 깨달았습니다. git pull --rebase(
— Vaz

8

Kevin Ballard가 제안한 별칭은 완벽하게 좋은 솔루션입니다. 다른 옵션을 던지기 위해 단순히 실행되는 병합 후 후크를 사용할 수도 있습니다 git submodule update [--init].


7

하위 모듈 업데이트를 자동으로 처리하는 git 명령의 별칭을 만들 수 있습니다. .bashrc에 다음을 추가하십시오.

# make git submodules usable
#   This overwrites the 'git' command with modifications where necessary, and
#   calls the original otherwise
git() {
    if [[ $@ == clone* ]]; then
        gitargs=$(echo "$@" | cut -c6-)
        command git clone --recursive $gitargs
    elif [[ $@ == pull* ]]; then
        command git "$@" && git submodule update --init --recursive
    elif [[ $@ == checkout* ]]; then
        command git "$@" && git submodule update --init --recursive
    else
        command git "$@"
    fi
}

1
git의 별칭 대신 alias 명령을 통해 또는 git- (git-bettermodule)로 시작하는 경로에 명령을 생성하여 git에 별칭을 추가 할 수 있습니다
— idbrii

7

다른 사람들이 언급했듯이 다음을 사용하여 쉽게 설정할 수 있습니다.

git config --global submodule.recurse true

그러나 나와 같고 더 복잡한 .gitconfig설정 (내 기본 ~/.gitconfig파일 include이 다른 .gitconfig파일 을로드하는 데 사용 )이 있고 명령 줄 git구성 형식과 형식 사이를 변환하는 방법을 기억할 수 없다면 .gitconfig여기에 추가하는 방법이 있습니다. 모든 .gitconfig파일에 :

[submodule]
  recurse = true

0

서브 모듈과 중첩 된 서브 모듈을 업데이트 할 수있는 방법 만 :

git submodule update --remote --merge --recursive; git submodule foreach --recursive "(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);" git add .; git commit -m 'SubmodulesSynced'; git push; git pull;

대괄호로 인해 터미널을 통해 별칭을 만드는 데 어려움을 겪고 있으므로 전역을 위해 .gitconfig에 수동으로 추가해야했습니다.

[alias] supdate = "!git submodule update --remote --merge --recursive; git submodule foreach --recursive '(git add .; git commit -m 'SubmoduleSync'; git push; git pull;);' git add .; git commit -m 'SubmodulesSynced'; git push; git pull;"

명령이나 별칭을 자동으로 실행하는 방법에 대한 제안 사항이 있습니까?

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