.gitmodules에서 git 하위 모듈 복원
git repo 폴더가 있습니다. 일부 파일과 .gitmodules 파일이 포함되어 있습니다. 내가 할 때 이제 git init
다음과 git submodule init
, 후자의 명령 출력은 아무것도 아니다. git submodule add
다시 손으로 실행하지 않고 .gitmodules 파일에 정의 된 하위 모듈을 볼 수 있도록 git을 어떻게 도울 수 있습니까?
업데이트 : 이것은 내 .gitmodules 파일입니다.
[submodule "vim-pathogen"]
path = vim-pathogen
url = git://github.com/tpope/vim-pathogen.git
[submodule "bundle/python-mode"]
path = bundle/python-mode
url = git://github.com/klen/python-mode.git
[submodule "bundle/vim-fugitive"]
path = bundle/vim-fugitive
url = git://github.com/tpope/vim-fugitive.git
[submodule "bundle/ctrlp.vim"]
path = bundle/ctrlp.vim
url = git://github.com/kien/ctrlp.vim.git
[submodule "bundle/vim-tomorrow-theme"]
path = bundle/vim-tomorrow-theme
url = git://github.com/chriskempson/vim-tomorrow-theme.git
이 디렉토리의 목록은 다음과 같습니다.
drwxr-xr-x 4 evgeniuz 100 4096 июня 29 12:06 .
drwx------ 60 evgeniuz 100 4096 июня 29 11:43 ..
drwxr-xr-x 2 evgeniuz 100 4096 июня 29 10:03 autoload
drwxr-xr-x 7 evgeniuz 100 4096 июня 29 12:13 .git
-rw-r--r-- 1 evgeniuz 100 542 июня 29 11:45 .gitmodules
-rw-r--r-- 1 evgeniuz 100 243 июня 29 11:18 .vimrc
따라서 확실히 최상위 수준입니다. git 디렉토리는 변경되지 않고 git init
완료됩니다.
git submodule init
초기화를 위해 이미 인덱스 (예 : "스테이지")에있는 하위 모듈 만 고려합니다. 을 구문 분석 .gitmodules
하고 각 url
및 path
쌍 에 대해 실행 되는 짧은 스크립트를 작성 합니다.
git submodule add <url> <path>
예를 들어 다음 스크립트를 사용할 수 있습니다.
#!/bin/sh
set -e
git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
while read path_key path
do
url_key=$(echo $path_key | sed 's/\.path/.url/')
url=$(git config -f .gitmodules --get "$url_key")
git submodule add $url $path
done
이것은 git-submodule.sh
스크립트 자체가 .gitmodules
파일을 구문 분석하는 방법을 기반으로 합니다.
@Mark Longair의 답변을 확장하여 다음 프로세스의 2 단계와 3 단계를 자동화하는 bash 스크립트를 작성했습니다.
- '보일러 플레이트'저장소를 복제하여 새 프로젝트 시작
- .git 폴더를 제거하고 새 저장소로 다시 초기화하십시오.
- 하위 모듈을 다시 초기화하여 폴더를 삭제하기 전에 입력을 요청합니다.
#!/bin/bash
set -e
rm -rf .git
git init
git config -f .gitmodules --get-regexp '^submodule\..*\.path$' > tempfile
while read -u 3 path_key path
do
url_key=$(echo $path_key | sed 's/\.path/.url/')
url=$(git config -f .gitmodules --get "$url_key")
read -p "Are you sure you want to delete $path and re-initialize as a new submodule? " yn
case $yn in
[Yy]* ) rm -rf $path; git submodule add $url $path; echo "$path has been initialized";;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done 3<tempfile
rm tempfile
참고 : 하위 모듈은 상용구 저장소와 동일한 커밋 대신 마스터 브랜치의 끝에서 체크 아웃되므로 수동으로 수행해야합니다.
git config의 출력을 읽기 루프로 파이핑하면 입력 프롬프트에 문제가 발생하여 대신 임시 파일로 출력됩니다. 내 첫 번째 bash 스크립트의 개선 사항은 매우 환영받을 것입니다. :)
Big thanks to Mark, https://stackoverflow.com/a/226724/193494, bash: nested interactive read within a loop that's also using read, and tnettenba @ chat.freenode.net for helping me arrive at this solution!
Extending excellent @Mark Longair's answer to add submodule respecting branch and repo name.
#!/bin/sh
set -e
git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
while read path_key path
do
name=$(echo $path_key | sed 's/\submodule\.\(.*\)\.path/\1/')
url_key=$(echo $path_key | sed 's/\.path/.url/')
branch_key=$(echo $path_key | sed 's/\.path/.branch/')
url=$(git config -f .gitmodules --get "$url_key")
branch=$(git config -f .gitmodules --get "$branch_key" || echo "master")
git submodule add -b $branch --name $name $url $path || continue
done
I had a similar issue. git submodule init
was failing silently.
When I did:
git submodule add <url> <path>
I got:
The following path is ignored by one of your .gitignore files: ...
I'm thinking that .gitignore(d) paths might be the cause.
I know its been a while, but I want to share this version that calls git config
only once, doesn't requires a script and also handles branches:
git config -f .gitmodules --get-regexp '^submodule\.' | perl -lane'
$conf{$F[0]} = $F[1]}{
@mods = map {s,\.path$,,; $_} grep {/\.path$/} keys(%conf);
sub expand{$i = shift; map {$conf{$i . $_}} qw(.path .url .branch)}
for $i (@mods){
($path, $url, $branch) = expand($i);
print(qq{rm -rf $path});
print(qq{git submodule add -b $branch $url $path});
}
'
The only side effect is the output of the commands, nothing gets executed, so you can audit before committing to them.
This works with a simple copy and paste at the console, but should be trivial to put in a shell script.
example output:
rm -rf third-party/dht
git submodule add -b post-0.25-transmission https://github.com/transmission/dht third-party/dht
rm -rf third-party/libutp
git submodule add -b post-3.3-transmission https://github.com/transmission/libutp third-party/libutp
rm -rf third-party/libb64
git submodule add -b post-1.2.1-transmission https://github.com/transmission/libb64 third-party/libb64
rm -rf third-party/libnatpmp
git submodule add -b post-20151025-transmission https://github.com/transmission/libnatpmp third-party/libnatpmp
rm -rf third-party/miniupnpc
git submodule add -b post-2.0.20170509-transmission https://github.com/transmission/miniupnpc third-party/miniupnpc
rm -rf third-party/libevent
git submodule add -b post-2.0.22-transmission https://github.com/transmission/libevent third-party/libevent
참고URL : https://stackoverflow.com/questions/11258737/restore-git-submodules-from-gitmodules
'Programing' 카테고리의 다른 글
git-ls-remote를 나열 할 때 태그 이름 뒤에 "^ {}"가있는 이유는 무엇입니까? (0) | 2020.11.15 |
---|---|
`find -perm`을 사용하여 권한이 설정되지 않은 경우 찾기 (0) | 2020.11.15 |
Java 오류 : 비교 방법이 일반 계약을 위반 함 (0) | 2020.11.14 |
권장 ServiceStack API 구조 (0) | 2020.11.14 |
Visual Studio Code의 기본 어두운 테마를 편집하는 방법은 무엇입니까? (0) | 2020.11.14 |