우리는 git 하위 모듈을 사용하여 우리가 개발한 많은 다른 라이브러리에 종속된 몇 가지 대규모 프로젝트를 관리하고 있습니다. 각 라이브러리는 종속 프로젝트에 하위 모듈로 가져온 별도의 저장소입니다. 개발하는 동안 우리는 종종 모든 종속 하위 모듈의 최신 버전을 얻으려고 합니다.
git에 이 작업을 수행하는 명령이 내장되어 있습니까? 그렇지 않은 경우 Windows 배치 파일 또는 이와 유사한 작업을 수행할 수 있습니까?
질문자 :Brad Robinson
우리는 git 하위 모듈을 사용하여 우리가 개발한 많은 다른 라이브러리에 종속된 몇 가지 대규모 프로젝트를 관리하고 있습니다. 각 라이브러리는 종속 프로젝트에 하위 모듈로 가져온 별도의 저장소입니다. 개발하는 동안 우리는 종종 모든 종속 하위 모듈의 최신 버전을 얻으려고 합니다.
git에 이 작업을 수행하는 명령이 내장되어 있습니까? 그렇지 않은 경우 Windows 배치 파일 또는 이와 유사한 작업을 수행할 수 있습니까?
저장소를 처음 체크아웃하는 경우 --init
먼저 사용해야 합니다.
git submodule update --init --recursive
git 1.8.2 이상의 경우 원격 분기의 최신 팁 업데이트를 지원하기 위해 --remote
git submodule update --recursive --remote
.gitmodules
또는 .git/config
파일에 지정된 "기본이 아닌" 분기를 존중하는 추가 이점이 있습니다(있는 경우 기본값은 origin/master입니다. 이 경우 여기의 다른 답변 중 일부는 다음과 같이 작동합니다. 잘).
git 1.7.3 이상의 경우 다음을 사용할 수 있습니다.
git submodule update --recursive
또는:
git pull --recurse-submodules
리포지토리가 가리키는 현재 커밋 대신 하위 모듈을 최신 커밋으로 가져오려는 경우.
자세한 내용은 git-submodule(1) 을 참조하세요.
git pull --recurse-submodules --jobs=10
1.8.5에서 처음 배운 기능 git.
버그 가 수정될 때까지 처음으로 실행해야 합니다.
git 하위 모듈 업데이트 --init --recursive
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
합니다. 오류를 확인하십시오.이 스타일은 실제로 git 하위 모듈이 설계된 목적이 아니라는 점을 언급하고 싶습니다. 일반적으로 "LibraryX"는 버전 "2.32"이며 "업그레이드"라고 말할 때까지 그대로 유지됩니다.
즉, 어떤 의미에서는 설명된 스크립트로 수행하는 작업이지만 더 자동입니다. 케어가 필요합니다!
업데이트 2:
Windows 플랫폼을 사용하는 경우 Python을 사용하여 이러한 영역에서 매우 뛰어난 스크립트를 구현할 수 있습니다. 유닉스/리눅스에 있다면 bash 스크립트만 제안합니다.
설명이 필요하십니까? 댓글을 달면 됩니다.
Henrik은 올바른 길을 가고 있습니다. 'foreach' 명령은 임의의 쉘 스크립트를 실행할 수 있습니다. 가장 최신 정보를 가져오는 두 가지 옵션은
git submodule foreach git pull origin master
그리고,
git submodule foreach /path/to/some/cool/script.sh
초기화된 모든 하위 모듈을 반복하고 지정된 명령을 실행합니다.
다음은 Windows에서 저에게 효과적이었습니다.
git submodule init git submodule update
복제 및 초기화 하위 모듈
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
참고: 마지막 두 명령의 동작은 동일합니다.
하위 모듈의 기본 분기가 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'
편집 :
의견에서 ( philfreo 에 의해) 최신 버전이 필요하다고 지적했습니다. 최신 버전이어야 하는 중첩된 하위 모듈이 있는 경우:
git submodule foreach --recursive git pull
------아래에 오래된 주석-----
공식적으로 하는 방법 아닌가요?
git submodule update --init
매번 사용합니다. 지금까지는 문제가 없습니다.
편집하다:
방금 다음을 사용할 수 있음을 발견했습니다.
git submodule foreach --recursive git submodule update --init
또한 모든 하위 모듈, 즉 종속성을 재귀적으로 끌어옵니다.
어떤 버전의 git이 작동하는지 모르지만 이것이 당신이 찾고있는 것입니다.
git submodule update --recursive
git pull
과 함께 사용하여 루트 저장소도 업데이트합니다.
git pull && git submodule update --recursive
위의 답변은 좋지만 git-hooks를 사용하여 이를 더 쉽게 만들었습니다. 그러나 git 2.14 에서는 git config submodule.recurse
를 true로 설정하여 git 저장소로 가져올 때 하위 모듈이 업데이트되도록 할 수 있습니다.
이것은 분기에 있는 경우 모든 하위 모듈 변경 사항을 푸시하는 부작용이 있지만 해당 동작이 이미 필요한 경우 작업을 수행할 수 있습니다.
다음을 사용하여 수행할 수 있습니다.
git config submodule.recurse true
Windows 2.6.3 용 Git:
git submodule update --rebase --remote
나를 위해 git 2.24.03은 .gitmoodule에 정의된 원격 분기의 최신 커밋으로 업데이트됩니다.
git submodule update --recursive --init
git submodule update --recursive --remote
git 버전 2.24.3(Apple Git-128)
참고: 누군가 git pull --recurse-submodules
git submodule update --recursive --remote
와 동일하다고 말했습니다. 그러나 내 테스트에서 git pull --recurse-submodules
는 .gitmoodule에 정의된 원격 분기의 최신 커밋으로 업데이트되지 않을 수 있습니다.
리포지토리의 최상위 수준에서:
git submodule foreach git checkout develop git submodule foreach git pull
이렇게 하면 모든 분기가 최신 개발 및 가져오기로 전환됩니다.
나는 종종 이 명령을 사용하는데, 지금까지 작동합니다.
git pull git submodule foreach --recursive git checkout master git submodule foreach --recursive git pull
이 더 빨리 바랍니다.
위 의 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 에 예가 있습니다.
이제 간단한 git checkout
이 전역 구성을 통해 활성화해야 합니다. git config --global submodule.recurse true
다음은 하위 모듈이든 아니든 모든 git 리포지토리에서 가져오는 명령줄입니다.
ROOT=$(git rev-parse --show-toplevel 2> /dev/null) find "$ROOT" -name .git -type d -execdir git pull -v ';'
최상위 git 저장소에서 실행하는 경우 "$ROOT"
를 .
.
비고: 너무 쉬운 방법은 아니지만 실행 가능하며 고유한 장점이 있습니다.
저장소의 HEAD
HEAD
만 복제하려는 경우(즉, "트렁크"를 체크아웃하기 위해) 다음 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
이렇게 하려면 스크립트를 작성해야 한다고 생각합니다. 솔직히 말해서, 나는 그래서 당신이 사용할 수있는 그것을 할 파이썬을 설치할 수 os.walk
에 cd
각 디렉토리에 적절한 명령을 실행합니다. 파이썬이나 배치가 아닌 다른 스크립팅 언어를 사용하면 스크립트를 수정하지 않고도 하위 프로젝트를 쉽게 추가/제거할 수 있습니다.
출처 : http:www.stackoverflow.com/questions/1030169/easy-way-to-pull-latest-of-all-git-submodules
PHP 'foreach'는 실제로 어떻게 작동합니까? (0) | 2021.12.02 |
---|---|
Ruby에서 switch 문을 작성하는 방법 (0) | 2021.12.02 |
Docker 컨테이너 내부에서 머신의 로컬 호스트에 어떻게 연결합니까? (0) | 2021.12.02 |
C# 자동 속성에 초기 값을 제공하는 가장 좋은 방법은 무엇입니까? (0) | 2021.12.02 |
Git 리포지토리에서 파일을 삭제하려면 어떻게 해야 합니까? (0) | 2021.12.02 |