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.
부울로 설정하면 동작 변경 fetchpull서브 모듈로 무조건 같이 Recurse false로 전혀 사실에 대한 여부를 같이 Recurse로 설정 세트를.

시에 설정 on-demand(기본값), fetchpull 단지 같이 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.