우리는 git 서브 모듈을 사용하여 우리가 개발 한 다른 많은 라이브러리에 의존하는 두 개의 큰 프로젝트를 관리합니다. 각 라이브러리는 하위 프로젝트로 종속 프로젝트에 가져온 별도의 저장소입니다. 개발 과정에서 우리는 종종 모든 종속 서브 모듈의 최신 버전을 원합니다.
git에 이것을 수행하는 명령이 있습니까? 그렇지 않은 경우 Windows 배치 파일 또는 이와 유사한 파일은 어떻습니까?
우리는 git 서브 모듈을 사용하여 우리가 개발 한 다른 많은 라이브러리에 의존하는 두 개의 큰 프로젝트를 관리합니다. 각 라이브러리는 하위 프로젝트로 종속 프로젝트에 가져온 별도의 저장소입니다. 개발 과정에서 우리는 종종 모든 종속 서브 모듈의 최신 버전을 원합니다.
git에 이것을 수행하는 명령이 있습니까? 그렇지 않은 경우 Windows 배치 파일 또는 이와 유사한 파일은 어떻습니까?
답변:
그것의 경우 처음으로 당신이 체크 아웃 사용할 필요 REPO --init
첫 번째 :
git submodule update --init --recursive
들어 자식 1.8.2 이상, 옵션은 --remote
원격 지사의 최신 팁 지원 업데이트에 추가되었습니다 :
git submodule update --recursive --remote
이것은 .gitmodules
또는 .git/config
파일에 지정된 "기본이 아닌"브랜치를 존중할 수있는 추가적인 이점이 있습니다 .
들어 자식 1.7.3 사용하거나 위의 (하지만 업데이트가 계속 적용 무엇 주위 개는 아래의) :
git submodule update --recursive
또는:
git pull --recurse-submodules
하위 커밋을 현재 커밋 대신 최신 커밋으로 가져 오려면 리포지토리가 가리 킵니다.
자세한 내용은 git-submodule (1) 을 참조하십시오
git submodule update --recursive
요즘 사용해야합니다 .
git submodule foreach "(git checkout master; git pull)&"
origin master
일부 하위 모듈이 특정 하위 모듈의 다른 브랜치 또는 위치 이름을 추적하는 경우이 명령의 끝에 맹목적으로 고정 하면 예기치 않은 결과가 발생할 수 있습니다. 일부에게는 분명하지만 모든 사람에게는 해당되지 않습니다.
git submodule update --recursive
상위 리포지토리가 각 하위 모듈에 대해 저장 한 개정을 확인한 다음 각 하위 모듈에서 해당 개정을 확인합니다. 각 하위 모듈에 대한 최신 커밋을 가져 오지 않습니다 . git submodule foreach git pull origin master
또는 git pull origin master --recurse-submodules
각 하위 모듈을 원래 리포지토리에서 최신으로 업데이트하려는 경우 원하는 것입니다. 그래야만 하위 모듈의 업데이트 된 해시로 부모 리포지토리에서 보류중인 변경 사항을 얻게됩니다. 확인 하시고 잘 하셨어요.
git pull --recurse-submodules --jobs=10
1.8.5에서 처음 배운 기능 자식.
버그 가 수정 될 때까지 처음으로 실행해야합니다
자식 모듈 업데이트 --init --recursive
git pull --recurse-submodules
도 git submodule update --recursive
않습니다 하지 초기화 새로 서브 모듈을 추가하지 않습니다. 그것들을 초기화하려면 다음을 실행해야합니다 git submodule update --recursive --init
. 매뉴얼 에서 인용 : 서브 모듈이 아직 초기화되지 않고 .gitmodules에 저장된 설정을 사용하려는 경우 --init 옵션을 사용하여 서브 모듈을 자동으로 초기화 할 수 있습니다.
git submodule update --recursive --remote
저장된 SHA-1 대신 하위 모듈을 원격 최신 개정으로 업데이트 하는 힌트를 추가 할 수도 있습니다 .
git submodule update --init --recursive
git repo 디렉토리 내에서 가장 잘 작동합니다.
하위 모듈을 포함한 모든 최신 정보가 표시됩니다.
git - the base command to perform any git command
submodule - Inspects, updates and manages submodules.
update - Update the registered submodules to match what the superproject
expects by cloning missing submodules and updating the working tree of the
submodules. The "updating" can be done in several ways depending on command
line options and the value of submodule.<name>.update configuration variable.
--init without the explicit init step if you do not intend to customize
any submodule locations.
--recursive is specified, this command will recurse into the registered
submodules, and update any nested submodules within.
git submodule update --recursive
git repo 디렉토리 내에서 가장 잘 작동합니다.
하위 모듈을 포함한 모든 최신 정보가 표시됩니다.
참고 : 이것은 2009 년 이후이며 지금은 좋았지 만 지금은 더 나은 옵션이 있습니다.
우리는 이것을 사용합니다. 라는 git-pup
:
#!/bin/bash
# Exists to fully update the git repo that you are sitting in...
git pull && git submodule init && git submodule update && git submodule status
적절한 bin 디렉토리 (/ usr / local / bin)에 넣으십시오. Windows의 경우 구문을 수정해야 작동 할 수 있습니다. :)
최신 정보:
원래의 저자가 모든 서브 모듈의 모든 HEAD를 가져 오는 것에 대한 의견에 응답하여 좋은 질문입니다.
나는 git
이것이 내부적으로 이것에 대한 명령을 가지고 있지 않다고 확신합니다 . 그렇게하려면 HEAD가 서브 모듈에 실제로 어떤 것인지 식별해야합니다. master
가장 최신의 지점 이라고 말하는 것만 큼 간단 할 수 있습니다 ...
그런 다음 다음을 수행하는 간단한 스크립트를 작성하십시오.
git submodule status
"수정 된"리포지토리를 확인하십시오 . 출력 라인의 첫 문자는 이것을 나타냅니다. 하위 리포지토리가 수정 된 경우 진행하지 않을 수 있습니다.git checkout master && git pull
. 오류를 확인하십시오.이 스타일은 실제로 자식 서브 모듈이 설계된 것이 아니라고 언급하고 싶습니다. 일반적으로 "LibraryX"의 버전이 "2.32"라고 말하고 "업그레이드"할 때까지 계속 유지합니다.
즉, 설명 된 스크립트로 수행하는 작업이지만 더 자동으로 수행됩니다. 관리가 필요합니다!
업데이트 2 :
Windows 플랫폼을 사용하는 경우 Python을 사용하여 이러한 영역에서 매우 유용한 스크립트를 구현할 수 있습니다. 유닉스 / 리눅스를 사용하고 있다면 bash 스크립트 만 제안합니다.
설명이 필요하십니까? 의견을 게시하십시오.
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
사용하십시오 git pup
.
git submodule init
서브 모듈이 포함 된 첫 번째 풀 후에 수행해야 하므로 모든 것이 올바르게 작동하기 시작했습니다.
다음은 Windows에서 나를 위해 일했습니다.
git submodule init
git submodule update
편집 :
의견에서 ( philfreo에 의해 ) 최신 버전이 필요하다고 지적했습니다 . 최신 버전이 필요한 중첩 서브 모듈이있는 경우 :
git submodule foreach --recursive git pull
----- 아래의 오래된 주석 -----
이것이 공식적인 방법이 아닙니까?
git submodule update --init
매번 사용합니다. 지금까지 아무런 문제가 없습니다.
편집하다:
방금 다음을 사용할 수 있음을 발견했습니다.
git submodule foreach --recursive git submodule update --init
또한 모든 하위 모듈, 즉 종속성을 재귀 적으로 가져옵니다.
git submodule update --init --recursive
git submodule foreach --recursive git pull
하위 모듈의 기본 분기가 아닌 경우 master
, 전체 Git 하위 모듈 업그레이드를 자동화하는 방법입니다.
git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
복제 및 초기화 하위 모듈
git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init
개발하는 동안 단지 서브 모듈을 잡아 당기고 업데이트하십시오.
git pull --recurse-submodules && git submodule update --recursive
git submodule foreach git pull origin master
git submodule update --remote --merge
참고 : 마지막 두 명령의 동작은 동일합니다
git submodule update
하여 트릭을했습니다. 이제 복제 첫 번째 단계에서 누락 된 하위 모듈 데이터를 다운로드하고 있습니다. 감사합니다. 나는 자식에 좋은 아니에요 : C
위의 답변은 좋지만 git-hooks를 사용하여 이것을 쉽게 만들었지 만 git 2.14 에서는 git config submodule.recurse
git 저장소로 가져올 때 하위 모듈을 업데이트하도록 true로 설정할 수 있습니다 .
이것은 모든 서브 모듈이 브랜치에있는 경우 변경 사항을 푸시하는 부작용이 있지만 그 동작이 필요한 경우 이미 작업을 수행 할 수 있습니다.
다음을 사용하여 수행 할 수 있습니다.
git config submodule.recurse true
git submodule init
서브 모듈이 아직 초기화되지 않은 경우에도 여전히이 옵션을 사용해야 합니다.
리포지토리의 최상위 레벨에서 :
git submodule foreach git checkout develop
git submodule foreach git pull
모든 브랜치를 개발하고 최신 버전으로 전환합니다.
git submodule foreach git pull origin master
가져오고 싶은 지점을 추가해야했습니다. 그 외에는 완벽하게 작동했습니다.
나는 gahooa 의 대답을 위 의 내용으로 수정 하여이 작업을 수행했습니다 .
자식과 통합 [alias]
...
부모 프로젝트에 다음과 같은 것이있는 경우 .gitmodules
:
[submodule "opt/submodules/solarized"]
path = opt/submodules/solarized
url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
path = opt/submodules/intellij-colors-solarized
url = git@github.com:jkaving/intellij-colors-solarized.git
.gitconfig 안에 이와 같은 것을 추가하십시오.
[alias]
updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "
그런 다음 서브 모듈을 업데이트하려면 다음을 실행하십시오.
git updatesubs
나는이 예 내에서의를 환경 설정의 repo .
비고 : 너무 쉬운 방법은 아니지만 실행 가능하며 고유 한 전문가가 있습니다.
만약 HEAD
리포지토리의 리비전과 HEAD
모든 서브 모듈 중 s 만을 복제하고자한다면 (즉, "트렁크"체크 아웃), 다음 Lua 스크립트를 사용할 수 있습니다 . 때로는 간단한 명령 git submodule update --init --recursive --remote --no-fetch --depth=1
으로 복구 할 수없는 git
오류가 발생할 수 있습니다 . 이 경우 디렉토리의 하위 디렉토리를 정리하고 명령을 .git/modules
사용하여 수동으로 하위 모듈을 복제해야 git clone --separate-git-dir
합니다. 유일한 복잡성은 수퍼 프로젝트 트리에서 URL , .git
서브 모듈 디렉토리 경로 및 서브 모듈 경로 를 찾는 것 입니다.
참고 : 스크립트는 https://github.com/boostorg/boost.git
리포지토리에 대해서만 테스트 됩니다. 특징 : 모든 서브 모듈은 동일한 호스트에서 호스팅 .gitmodules
되며 상대 URL 만 포함합니다 .
-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
print('# ' .. command)
return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
if submodule_ then
submodule = submodule_
path = nil
submodule_url = nil
else
local path_ = line:match('^%s*path = (.+)$')
if path_ then
path = path_
else
submodule_url = line:match('^%s*url = (.+)$')
end
if submodule and path and submodule_url then
-- execute('rm -rf ' .. path)
local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
-- execute('rm -rf ' .. git_dir)
execute('mkdir -p $(dirname "' .. git_dir .. '")')
if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
return 1
end
path = nil
submodule_url = nil
end
end
end