Git 서브 모듈을 어떻게 제거합니까?
그건 그렇고, 내가 단순히 할 수없는 이유가
git submodule rm whatever있습니까?
.git/config. 허용 된 답변은 하위 모듈을 완전히 제거하는 최신 방법을 보여줍니다. 또한이 답변에서 간결하게 설명되어 있습니다 : stackoverflow.com/a/36593218/1562138
Git 서브 모듈을 어떻게 제거합니까?
그건 그렇고, 내가 단순히 할 수없는 이유가
git submodule rm whatever있습니까?
.git/config. 허용 된 답변은 하위 모듈을 완전히 제거하는 최신 방법을 보여줍니다. 또한이 답변에서 간결하게 설명되어 있습니다 : stackoverflow.com/a/36593218/1562138
답변:
git1.8.3 이후 (2013 년 4 월 22 일) :
"
submodule init" 로 하위 모듈에 관심을 표명 한 후에는 "이 하위 모듈에 더 이상 관심이 없다"고 말하는 도자기 방법은 없었습니다 .
"submodule deinit"가 그렇게하는 방법입니다.
삭제 프로세스는 git rmgit1.8.5 2013 년 10 월부터 사용합니다 .
3 단계 제거 프로세스는 다음과 같습니다.
0. mv a/submodule a/submodule_tmp
1. git submodule deinit -f -- a/submodule
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)
# or, if you want to leave it in your working tree and have done step 0
3. git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule
rm -rf: 이것은 Daniel Schroeder 의 답변 에서 언급 되었으며 Eonil 에 의해 주석 에 요약되어 있습니다 .
이것은
.git/modules/<path-to-submodule>/변하지 않습니다.
따라서이 방법으로 하위 모듈을 한 번 삭제 한 후 다시 추가하면 리포지토리가 이미 손상되었으므로 불가능합니다.
git rm커밋 95c16418 참조 :
현재
git rm서브 모듈에서 " "를 사용 하면 서브 프로젝트의 작업 트리가 수퍼 프로젝트의 작업 트리에서 제거되고 인덱스에서 gitlink가 제거됩니다.
그러나 서브 모듈의 섹션.gitmodules은 그대로 유지됩니다. 이는 이제 제거 된 서브 모듈의 남은 부분이며 사용자를 자극 할 수 있습니다 (의 설정과 달리.git/config사용자는이 서브 모듈에 관심을 보였으므로 나중에 다시 채워질 것입니다. 이전 커밋이 체크 아웃 될 때)."
git rm"는 작업 트리에서 서브 모듈을 제거 할뿐만 아니라 파일submodule.<submodule name>에서 " "섹션을 제거하여 사용자를 도울 수 있도록합니다.gitmodules.
git submodule deinit: 이 패치 에서 비롯됩니다 .
"
git submodule init"를 사용하면 사용자는 git에게 하나 이상의 하위 모듈에 대해 신경을 쓰고 다음에 "git submodule update"를 호출 할 때이를 채우려 고합니다.
그러나 현재 git에게 더 이상 서브 모듈을 신경 쓰지 않고 로컬 작업 트리를 제거하고 싶다고 말할 수있는 쉬운 방법은 없습니다 (사용자가 서브 모듈 내부에 대해 많이 알고 작업과 함께 "submodule.$name.url"설정을 제거하지 않는 한).git/config나무 자신).'
deinit'명령 을 제공하여 해당 사용자를 지원하십시오 .
이것은 주어진 서브 모듈 (또는 ' '이 주어지면 초기화 된 모든 모듈) 에서 전체submodule.<name>섹션을 제거합니다.git/config..
강제하지 않으면 현재 작업 트리에 수정 사항이 포함되어 있으면 실패합니다.
커맨드 라인에 주어진 서브 모듈에 대해 URL 설정을 찾을 수.git/config없지만 그럼에도 불구하고 실패하지는 마십시오.
초기화 단계 ( .git/config및 .git/modules/xxx)가
git1.8.5 때문에이 git rm걸립니다 도 의 상관 :
add' .gitmodules파일에 하위 모듈의 URL을 기록하는 단계 : 제거해야합니다.git rm --cached path_to_submodule(후행 슬래시 없음) 마지막 단계를 잊고 하위 모듈을 일반 디렉토리로 추가하려고하면 다음과 같은 오류 메시지가 표시됩니다.
git add mysubmodule/file.txt
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
참고 : Git 2.17 (Q2 2018) 이후 git 서브 모듈 deinit는 더 이상 쉘 스크립트가 아닙니다.
C 함수를 호출합니다.
Prathamesh Chavan ( )의 commit 2e61273 , commit 1342476 (2018 년 1 월 14 일)을 참조하십시오 . (의해 병합 Junio C 하마노 - - 에 ead8dbe 커밋 13 이월 2018)pratham-pc
gitster
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
${GIT_QUIET:+--quiet} \
${prefix:+--prefix "$prefix"} \
${force:+--force} \
${deinit_all:+--all} "$@"
submodule deinit?
.gitmodules확인을해야하지만, 난 더블 체크 아무 여전히 것 .git디렉토리 (즉, 지방 지역의 repo에서 설정, : 아니다 에 의해 수정 됨 git pull)
.gitmodules항목의 제거와 색인의 특수 항목 제거를 커밋하고 해당 저장소를 푸시하면 다른 사람들 이 해당 항목을 가져와 하위 모듈이 사라집니다.
git rm submodule사람들은 이미 다른 사람들이 말했듯이 원하는 것을 정확하게 수행합니다.
Git 서브 모듈 튜토리얼 페이지를 통해 :
서브 모듈을 제거하려면 다음이 필요합니다.
.gitmodules파일 에서 관련 섹션을 삭제 하십시오..gitmodules변경 :git add .gitmodules.git/config.git rm --cached path_to_submodule(후행 슬래시 없음)..git디렉토리를 제거하십시오 :rm -rf .git/modules/path_to_submodulegit commit -m "Removed submodule <name>"rm -rf path_to_submodule참조 : 아래의 다른 단계를 .
git submodule rm단순히 서브 모듈 등록을 제거 한다고 생각 하고 명령이 로컬 리포지토리를 삭제하면 놀라게 될 것입니다. 모든 로컬 변경 사항은 복구 할 수 없을 정도로 손실됩니다. 그리고 아마도 다른 사람은 파일 만 제거 될 것이라고 생각할 것입니다.
그냥 참고하십시오. git 1.8.5.2부터 두 가지 명령이 수행됩니다.
git rm the_submodule
rm -rf .git/modules/the_submodule
@ Mark Cheverton의 답변이 올바르게 지적했듯이 두 번째 줄을 사용하지 않으면 지금 하위 모듈을 제거하더라도 나머지 .git / modules / the_submodule 폴더는 동일한 하위 모듈이 나중에 다시 추가되거나 교체되지 않도록합니다 . 또한 @VonC가 언급했듯이 git rm서브 모듈에서 대부분의 작업을 수행합니다.
-업데이트 (07/05/2017)-
명확히하기 위해 the_submodule프로젝트 내부의 하위 모듈의 상대 경로입니다. 예를 들어, subdir/my_submodule서브 모듈이 서브 디렉토리 안에있는 경우 subdir입니다.
주석과 다른 답변 에서 올바르게 지적했듯이 두 명령 (하위 모듈을 제거하기에는 기능적으로 충분하지만)의 [submodule "the_submodule"]섹션에 추적을 남기고 .git/config(2017 년 7 월 현재) 세 번째 명령을 사용하여 제거 할 수 있습니다.
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
.git/config. 서브 모듈을 완전히 제거하는 방법 은 stackoverflow.com/a/36593218/1562138 을 참조하십시오 .
git init && git submodule add <repository> && git rm <name>뒤에 남겨 둡니다 . 아마도 서브 모듈을 제거하기 전에 초기화하지 않았습니까? .git/config.git/modules/<name>
이 질문에 대한 대부분의 답변은 구식이거나 불완전하거나 불필요하게 복잡합니다.
git 1.7.8 이상을 사용하여 복제 된 하위 모듈은 로컬 저장소에 최대 네 개의 흔적을 남깁니다. 이 네 가지 트레이스를 제거하는 프로세스는 아래 세 가지 명령으로 제공됩니다.
# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule
# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule
# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule
간단한 단계
git config -f .git/config --remove-section submodule.$submodulenamegit config -f .gitmodules --remove-section submodule.$submodulenamegit rm --cached $submodulepathrm -rf $submodulepathrm -rf .git/modules/$submodulename참고 : $submodulepath 선행 또는 후행 슬래시는 포함하지 않습니다.
배경
당신이 할 때 git submodule add, 그것은 단지 그것을 추가 .gitmodules하지만, 일단 당신이 git submodule init그것을 추가했습니다 .git/config.
따라서 모듈을 제거하고 싶지만 빠르게 복원 할 수있게하려면 다음과 같이하십시오.
git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath
이것을 스크립트에 넣으면 git rebase HEAD처음부터 git commit끝까지 하는 것이 좋습니다 .
또한 Git 하위 모듈을 채울 수 있습니까? 에 대한 답변도 살펴보십시오 . .
for dir in directory/*; do git rm --cached $dir; done.
git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'뭔가 엉망이있는 경우 실제로 이것을 해야하는 것처럼 보입니다. 그렇지 않으면git submodule | grep -v '^+' | cut -d' ' -f3
git submodule | grep '^+' | cut -d' ' -f2
submodulename큰 따옴표로 묶어야했다 "submodulename".. .git/config파일 참조
권장 사항 외에도 rm -Rf .git/modules/path/to/submodule동일한 이름의 새 하위 모듈을 추가 할 수 있어야했습니다 (제 경우에는 포크를 원본으로 교체했습니다)
다음을 사용하여 추가 된 서브 모듈을 제거하려면 다음을 수행하십시오.
git submodule add blah@blah.com:repos/blah.git lib/blah
운영:
git rm lib/blah
그게 다야.
이전 버전의 git (~ 1.8.5 경)의 경우 다음을 사용하십시오.
git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah
git rm여전히에 물건을 남깁니다 .git/modules/. (2.5.4)
git rm하지 않으면; 내 Mac에서 2.5.4로 빠른 테스트를 수행 하면 git-scm.com/docs/git-rm#_submodules ... 설명서에 설명 된대로 .gitmodules 파일이 업데이트 되지만 플랫폼의 조합을 발견 한 경우 / 이런 일이 발생하지 않는 버전에 대해서는 아마도 버그를 제기해야합니다.
git rm물건을 남깁니다 (우분투, 자식 2.7.4). 다른 답변 100 % 작동 : stackoverflow.com/a/36593218/4973698.git/modules/.git/config
.gitmodules및 에서 항목을 제거하고 기록에서 .git/config모듈의 디렉토리를 제거 해야합니다 .
git rm --cached path/to/submodule
git의 메일 링리스트에 글을 쓰면 누군가가 쉘 스크립트를 만들 것입니다.
별명을 사용하여 다른 사람이 제공 한 솔루션을 자동화 할 수 있습니다.
[alias]
rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"
git config에 넣고 다음을 수행하십시오. git rms path/to/submodule
git clone https://github.com/hilbix/empty.git; cd empty; git submodule add https://github.com/hilbix/empty.git one; git mv one two; git rms two. 두 번째 : 올바른 경로에서 실행해야합니다. git별명은 작업 트리의 어느 곳에서나 작동해야합니다 (또는 정상적으로 실패). THIRD : 일반적으로 파일이있는 git config -f .git/config것처럼 하위 모듈 내에서 실패합니다 .git.
요약하면 다음과 같습니다.
path_to_submodulevar 설정 (슬래시 없음) :
path_to_submodule=path/to/submodule
.gitmodules 파일에서 관련 행을 삭제하십시오.
git config -f .gitmodules --remove-section submodule.$path_to_submodule
.git / config에서 관련 섹션을 삭제하십시오.
git config -f .git/config --remove-section submodule.$path_to_submodule
인덱스에서 $ path_to_submodule을 스테이지 해제하고 제거하여 정보 손실
git rm --cached $path_to_submodule
.gitmodule에 대한 변경 사항 추적
git add .gitmodules
슈퍼 프로젝트 커밋
git commit -m "Remove submodule submodule_name"
지금 추적되지 않은 서브 모듈 파일 삭제
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
git submodule update. 하위 모듈 경로가 올바르게 업데이트되지 않은 경우 (git에서 오류가 발생 함) 제거하십시오.rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
나는 deinit나에게 좋은 작품을 발견했다 .
git submodule deinit <submodule-name>
git rm <submodule-name>
에서 자식 문서 :
초기화 해제
주어진 서브 모듈의 등록을 해제하십시오. 즉,
submodule.$name작업 트리와 함께 .git / config에서 전체 섹션을 제거하십시오 .
git commit디렉토리 작업에서 개최 변경 사항을 적용하려면 다음 modified .gitmodules과 deleted <submodule-path>.
이 사이트에서 다른 모든 답변을 실험 한 후이 솔루션을 사용했습니다.
#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
echo "$path is no valid git submodule"
exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path
서브 모듈을 추가하기 전과 동일한 상태로 복원됩니다. 서브 모듈을 즉시 다시 추가 할 수 있습니다. 대부분의 답변으로는 불가능했습니다.
git submodule add $giturl test
aboveScript test
커밋 할 변경없이 깔끔한 체크 아웃이 가능합니다.
이것은 다음과 같이 테스트되었습니다.
$ git --version
git version 1.9.3 (Apple Git-50)
git rm --cached $path다음 을 사용 합니까? rm -rf $pathgit rm -r $path
git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> 스크립트를 사용하여 '위험한 .. 서브 모듈'을 제거하려고 할 때, 이것은 rm -rf ..아마도 당신이 원하는 것이 아닐 것입니다 ..
내가 현재 2012 년 12 월하고있는 일 (이 답변의 대부분을 결합) :
oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}" ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"
여기 내가 한 일이 있습니다.
1.) .gitmodules 파일에서 관련 섹션을 삭제하십시오. 아래 명령을 사용할 수 있습니다 :
git config -f .gitmodules --remove-section "submodule.submodule_name"
2.) .gitmodules변화를 준비하라
git add .gitmodules
3.)에서 관련 섹션을 삭제하십시오 .git/config. 아래 명령을 사용할 수 있습니다 :
git submodule deinit -f "submodule_name"
4.) gitlink를 제거하십시오 (후행 슬래시 없음).
git rm --cached path_to_submodule
5.) 정리 .git/modules:
rm -rf .git/modules/path_to_submodule
6.) 커밋 :
git commit -m "Removed submodule <name>"
7.) 이제 추적되지 않은 하위 모듈 파일을 삭제하십시오.
rm -rf path_to_submodule
fatal: no submodule mapping found in .gitmodules for path 'submodule_name'단계 3에서 주었다 . 그러나 두 단계 모두 필요했다. (git v2.8.2)
나는 최근에 유용한 git 관련 명령을 포함하는 git 프로젝트를 발견했다 : https://github.com/visionmedia/git-extras
그것을 설치하고 입력하십시오 :
git-delete-submodule submodule
그런 다음 일이 완료됩니다. 서브 모듈 디렉토리는 repo에서 제거되고 파일 시스템에 여전히 존재합니다. 그런 다음 다음과 같이 변경 사항을 커밋 할 수 있습니다 git commit -am "Remove the submodule".
git delete-submodule로, git-extras필요 작업의 경로에있을 수 있습니다. 또한 많은 부분이 매우 버그가 많고 위험하므로 사용하지 않는 것이 좋습니다git-extras . IE 는 모듈과 경로가 동일하다고 가정하기 때문에 아래의 잘못된 경로 를 제거 할 수 있으며 하위 모듈 내에서 하위 모듈을 제거하려고하면 올바르게 작동하지 않습니다. 99 % 도움이 될 수 있지만 사용에 문제가있을 경우 불만을 제기하지 마십시오. 경고를 받았습니다! git-delete-submodule.git/modules/*git-extras
필요하거나 유용한 것으로 밝혀진 4 가지 단계는 다음과 같습니다 (중요한 단계부터).
git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."
이론적으로 , git rm의 1 단계 알아서해야한다. OP 질문의 두 번째 부분은 언젠가 긍정적으로 대답 할 수 있기를 바랍니다 (이것은 하나의 명령으로 수행 될 수 있음).
2017 년 7 월 현재 2 단계 는 데이터를 제거해야합니다..git/modules/ 예를 들어 나중에 서브 모듈을 다시 추가 할 수 없습니다.
tinlyx의 답변에서 언급했듯이 git 1.8.5 이상에 대한 위의 두 단계를 모두 벗어날 수 있습니다.git submodule 명령이 작동하는 것처럼 수 있습니다.
3 단계 the_submodule는 파일에서 섹션을 제거 합니다..git/config . 이것은 완전성을 위해 수행되어야합니다. (이 항목은 이전 git 버전에서 문제를 일으킬 수 있지만 테스트 할 버전이 없습니다).
이를 위해 대부분의 답변은을 사용하는 것이 좋습니다 git submodule deinit. 나는 그것을 사용하는 것이 더 명확하고 덜 혼란하다는 것을 알았습니다 git config -f .git/config --remove-section. 에 따르면 자식 - 서브 모듈 문서 , git deinit:
주어진 서브 모듈의 등록을 해제합니다 ... 리포지토리에서 서브 모듈을 제거하고 대신 git-rm [1]을 사용하여 커밋하려면 .
마지막으로, 그렇지 않은 경우 (git 2.7에서) git commit수행 할 때 오류가 발생할 수 있습니다 git submodule summary.
fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:
2 단계 또는 3 단계를 수행하는지 여부에 관계없이 적용됩니다.
project dir: ~/foo_project/
submodule: ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
1. cd ~/foo_project
2. git rm lib/asubmodule &&
rm .git/modules/lib/asubmodule &&
git submodule lib/asubmodule deinit --recursive --force
git 2.17 이상에서는 다음과 같습니다.
git submodule deinit -f {module_name}
git add {module_name}
git commit
git 2.17.1않았다 git 2.20.1. 그러나 git rm대신에 git add모두 사용하여 작동했습니다. 참고 사항 : 물건이 깨끗하면 -f필요하지 않습니다 . 반드시 옵션을 사용하지 않습니다 에 git당신이 의도하지 않은 데이터 손실을 방지하려는 경우입니다. 또한 이것은 .git/modules/{module_name}제자리에 남습니다 . 이로 인해 무언가가 막힌 경우 올바른 진행 방법 (!)을 인쇄하여 계속 진행하는 것이 좋으 므로 이를 유지하는 것이 가장 좋습니다git .
독자의 이익을 위해 여기에 요약하여 문제가 예상대로 작동하지 않는 경우 어떻게 수행하는지 단계별 가이드를 제공합니다. 다음은 하위 모듈을 제거하기 위해 버전 이상 에서 테스트되고 안전한 방법 입니다 .git2.17
submodule="path/to/sub" # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
2.20.1와 우분투에서 테스트 18.042.17.1 ."$submodule" 이름을 어디에 두어야하는지 강조하는 것입니다. 공백 등을 조심해야합니다."$submodule"하고 서브 모듈에 대한 경로를 올바르게 지정한 Windows 방식으로 바꾸십시오 . (나는 Windows가 아니다)경고!
.git디렉토리 내부를 직접 만지지 마십시오 ! 내부 편집.git은 어두운면으로 들어갑니다. 모든 비용을 멀리하십시오!그리고 예, 과거
git에 많은 편리한 것들이 빠져 있었기 때문에 이것을 비난 할 수 있습니다git. 하위 모듈을 다시 제거하는 올바른 방법과 같습니다.의 문서에 매우 위험한 부분이 있다고 생각
git submodule합니다.$GIT_DIR/modules/<name>/자신 을 제거하는 것이 좋습니다 . 내 이해에서 이것은 명백한 잘못 일뿐 만 아니라 매우 위험하며 앞으로 큰 두통을 유발합니다! 아래를 참조하십시오.
참고
git module deinit
직접적으로
git module init
그러나
git submodule deinit -- module
git rm -- module
또한 상당히 반대입니다
git submodule add -- URL module
git submodule update --init --recursive -- module
일부 명령은 기본적으로 단일 작업 이상을 수행해야하기 때문입니다.
git submodule deinit -- module
.git/configgit rm
.gitmodulesgit submodule add
.git/modules/NAME/git submodule init이므로 업데이트.git/configgit submodule update비재 귀적으로 모듈을 체크 아웃합니다..gitmodulesgit submodule update --init --recursive -- module
엄격하게 대칭을 유지하는 것은 의미가 없으므로 완전히 대칭이 될 수는 없습니다. 단순히 두 개 이상의 명령이 필요하지 않습니다. 또한 "데이터 풀링 (pulling in the data)"은 필요하기 때문에 암시 적이지만 캐시 된 정보를 제거하는 것은 수행되지 않습니다. 이는 전혀 필요하지 않으며 소중한 데이터를 지울 수 있기 때문입니다.
이것은 정말로 새로운 이민자에게 수수께끼이지만, 기본적으로 좋은 것입니다. git명백한 일을하고 올바르게 수행하고 더 많은 일을하려고하지도 않습니다. git"Eierlegende Wollmilchsau"( "Eierlegende Wollmilchsau"는 나를 "스위스 군용 칼의 일부 악의적 인 버전"으로 번역 함) 대신 신뢰할 수있는 작업을 수행해야하는 도구입니다.
그래서 나는 왜 사람들 git이 나를 위해 명백한 일을 하지 않는지에 대한 불만을 이해 합니다. 여기에서 "명백한"관점에서 볼 수 있기 때문입니다. 모든 상황에서 안정성이 훨씬 더 중요합니다. 그러므로 당신에게 명백한 것은 모든 가능한 기술적 상황에서 올바른 것이 아닙니다. 기억하십시오 : AFAICS git는 사회적 경로가 아닌 기술적 경로를 따릅니다. (따라서 영리한 이름 : git)
다음 명령으로 인해 위의 명령이 실패 할 수 있습니다.
git은 너무 늙었습니다. 그런 다음 최신을 사용하십시오 git. (아래 방법 참조)git clean의미 에서 깨끗하지 않습니다 . 그런 다음 먼저 해당 명령을 사용하여 서브 모듈을 청소하십시오. (아래 참조)git 있습니다. 그러면 당신은 어두운면에 있고 일이 추악하고 복잡해집니다. (아마 다른 기계를 사용하면 문제가 해결 될 수 있습니다.)git파워 유저입니다).가능한 수정 사항은 다음과 같습니다.
git컴퓨터가 너무 오래된 경우에는이없는 submodule deinit당신에 git. 를 업데이트하지 않으려면 (또는 업데이트 할 수있는 경우) git다른 컴퓨터를 최신 버전으로 사용하십시오 git! git완전히 분산되어 있으므로 다른 git것을 사용 하여 작업을 완료 할 수 있습니다 .
workhorse:~/path/to/worktree$ git status --porcelain 하지 않아야 출력 아무것도! 그렇다면 먼저 정리하십시오!workhorse:~/path/to/worktree$ ssh account@othermachineothermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORKothermachine:~/TMPWORK$ git commit . -m . && exitworkhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.gitworkhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD. 그래도 문제가 해결되지 않으면git reset --soft FETCH_HEADgit status다시 정리할 때까지 정리하십시오. 첫 단계 덕분에 이전에 깨끗해 졌기 때문에 그렇게 할 수 있습니다.이것은 othermachineVM이거나 Windows의 Ubuntu WSL 일 수 있습니다. 심지어 chroot(하지만 난 당신이 경우 때문에, 루트가 아닌 것으로 가정 root은 최신으로 업데이트 더 쉽게해야합니다 git).
ssh들어갈 수없는 경우 git리포지토리 를 전송하는 방법이 많이 있습니다. 작업 트리를 일부 USB 스틱 ( .git디렉토리 포함)에 복사 하고 스틱에서 복제 할 수 있습니다. 복사본을 복제하여 다시 깔끔하게 정리하십시오. 하위 시스템에 다른 시스템에서 직접 액세스 할 수없는 경우 PITA 일 수 있습니다. 그러나 이것에 대한 해결책도 있습니다.
git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX
이 곱셈을 사용할 수 있으며에 저장됩니다 $HOME/.gitconfig. 같은 것
git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/
같은 URL을 다시 작성
https://github.com/XXX/YYY.git
으로
/mnt/usb/repo/XXX/YYY.git
git이와 같은 강력한 기능에 익숙해지기 시작하면 쉽습니다 .
이 방법으로 잊어 버린 부분을 감지 할 수 있으므로 수동으로 정리하는 것이 좋습니다.
git status와 git clean -ixfd당신의 친구입니다rm하고 deinit당신이 할 수있는만큼. (같은 옵션 -f에 대한) git당신은 프로하면 좋다. 그러나 당신이 여기에 왔을 때, 당신은 아마도 그 submodule지역 에서 그다지 경험이 없을 것 입니다. 따라서 미안보다 안전합니다.예:
$ git status --porcelain
M two
$ git submodule deinit two
error: the following file has local modifications:
two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
NEW
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each
5: quit 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'
당신은, -f필요 가 없습니다 참조하십시오 submodule deinit. 어떤 git clean의미 에서 깨끗하다면 . 또한 git clean -x필요하지 않습니다. 이는 git submodule deinit무시되는 추적되지 않은 파일을 무조건 제거합니다. 이것은 일반적으로 원하는 것이지만 잊지 마십시오. 때로는 다시 계산하는 데 몇 시간에서 며칠이 걸리는 캐시 된 데이터와 같이 무시 된 파일이 소중 할 수 있습니다.
$GIT_DIR/modules/<name>/않습니까?아마도 사람들은 나중에 문제가 발생하기를 두려워하기 때문에 캐시 된 저장소를 제거하려고합니다. 이것은 사실이지만 그 "문제"에 부딪 치는 것이 그것을 해결하는 올바른 방법입니다! 수정이 쉽고, 제대로 이루어지기 때문에 행복하게 살 수 있습니다. 이렇게하면 데이터를 직접 제거 할 때보 다 더 번거로운 문제가 발생하지 않습니다.
예:
mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two
마지막 줄은 다음과 같은 오류를 출력합니다.
A git directory for 'two' is found locally with remote(s):
origin https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
왜이 오류가 발생합니까? 때문에 .git/modules/two/이전부터 채워했다 https://github.com/hilbix/empty.git 지금 즉, 다른 뭔가에서 다시 채워해야한다 https://github.com/hilbix/src.git . https://github.com/hilbix/empty.git 에서 다시 채울 경우이 메시지가 표시되지 않습니다
지금 무엇을해야합니까? 글쎄, 정확히 말한대로하십시오! 사용하다--name someunusedname
git submodule add --name someunusedname https://github.com/hilbix/src.git two
.gitmodules 다음처럼 보인다
[submodule "someunusedname"]
path = two
url = https://github.com/hilbix/src.git
ls -1p .git/modules/ 준다
someunusedname/
two/
이 방법 으로 앞으로 분기 / 커밋을 앞뒤로 전환 할 수 있으며two/ 서로 다른 두 개의 상류 저장소가 있기 때문에 다시 는 문제가 발생하지 않습니다. 가장 좋은 방법은 다음과 같습니다. 둘 다 로컬에 캐시 된 상태로 유지합니다.
git).그러나 캐시 된 디렉토리를 제거하면 --name옵션을 사용하지 않기 때문에 서로 다른 체크 아웃이 서로 넘어집니다 . 따라서 체크 아웃 할 때마다 .git/modules/<module>/디렉토리를 반복 해서 제거해야 합니다. 이것은 매우 번거롭고 같은 것을 사용하기가 어렵습니다 git bisect.
따라서이 모듈 디렉토리를 자리 표시 자로 유지해야하는 매우 기술적 이유가 있습니다. 아래에서 무언가를 제거하도록 권장하는 사람들 .git/modules/은 더 잘 알지 못하거나 이것이 강력한 기능을한다는 것을 잊어 버립니다.git bisect 이것이 서브 모듈 비 호환성을 넘어 서면 거의 불가능한 .
다른 이유는 위에 나와 있습니다. 를보십시오 ls. 거기에서 무엇을 보십니까?
음, 모듈의 제 2 변형 two/하에 있지 .git/modules/two/그것은 아래에있다 .git/modules/someunusedname/! 따라서 같은 git rm $module; rm -f .git/module/$module것은 완전히 잘못입니다! 상담 module/.git하거나 .gitmodules제거 할 올바른 것을 찾아야합니다!
따라서 대부분의 다른 답변은이 위험한 함정에 빠질뿐만 아니라 매우 인기있는 git확장 프로그램 에도이 버그가 있습니다 ( 이제 수정되었습니다 )! .git/당신이하고있는 일을 정확하게하지 않으면 디렉토리 의 손을 더 잘 유지하십시오 !
그리고 철학적 인 관점에서, 역사를 닦는 것은 항상 잘못입니다! 일반적으로 양자 역학을 제외하고 는 완전히 다른 것입니다.
참고로 아마 추측했을 것입니다 : hilbix 는 내 GitHub 계정입니다.
요약하면 다음과 같습니다.
path_to_submodule var 설정 (후행 슬래시 없음) :
path_to_submodule=path/to/submodule
.gitmodules 파일에서 관련 행을 삭제하십시오.
git config -f .gitmodules --remove-section submodule.$path_to_submodule
.git / config에서 관련 섹션을 삭제하십시오.
git config -f .git/config --remove-section submodule.$path_to_submodule
인덱스에서 $ path_to_submodule을 스테이지 해제하고 제거하십시오 (정보 손실을 방지하기 위해).
git rm --cached $path_to_submodule
.gitmodule에 대한 변경 사항 추적
git add .gitmodules
슈퍼 프로젝트 커밋
git commit -m "Remove submodule submodule_name"
지금 추적되지 않은 서브 모듈 파일 삭제
rm -rf $path_to_submodule
rm -rf .git/modules/$path_to_submodule
참조 : 대체 가이드 라인
git rm --cached $path_to_submodule하고 git add .gitmodules어떤을? : 나는 첫 번째 명령에 오류가 발생했던 fatal: Please stage your changes to .gitmodules or stash them to proceed나는에 unstaged 변경이 있었기 때문에 .gitmodules. git add .gitmodules첫 번째 작업을 수행하면 문제가 해결됩니다.
간단합니다.
.gitmodulesgit add .gitmodulesgit submodule deinit <path to submodule>git rm <path to submodule>프로젝트에서 모듈 파일을 수동으로 삭제해야합니다.
git submodule deinit <submodule_name>하고 git rm <path_to_submodule>. 마지막 명령은의 내부 항목을 자동으로 삭제합니다 .gitmodules. 힘내 2.17
제거 프로세스를 쉽게하기 위해 bash 스크립트를 만들었습니다. 또한 저장되지 않은 레포지토리에 변경 사항이 있는지 확인하고 확인을 요청합니다. 그것은 os x일반적인 리눅스 배포판에서와 같이 작동하는지 아는 것이 흥미로울 것입니다 :
https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f
아래와 같이 bash 스크립트를 사용하여 한 줄 명령 으로 수행 해야하는 경우 :
$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule
$HOMEdir 디렉토리 에 bash 스크립트 파일을 작성하십시오 remove_submodule.sh.
#!/bin/bash
git config -f .gitmodules --remove-section submodule.$1
git config -f .git/config --remove-section submodule.$1
git rm --cached $1
git add .gitmodules
git commit -m "Remove submodule in $1"
rm -rf $1
rm -rf .git/modules/$1
git push origin $(git rev-parse --abbrev-ref HEAD) --force --quiet
git rm <submodule path> && git commit. 을 사용하여 취소 할 수 있습니다 git revert.
.gitmodules파일 의 섹션)가 제거 됩니다.$GIT_DIR/modules/<name>/ .출처: git help submodules
git하위 모듈 을 제거하려면 4 단계가 필요합니다.
.gitmodules파일 에서 해당 항목을 제거하십시오 . 아래에 언급 된 것과 같은 항목이있을 수 있습니다.[submodule "path_to_submodule"]
path = path_to_submodule
url = url_path_to_submodule
git add .gitmodulesgit rm --cached <path_to_submodule>.git commit -m "Removed submodule xxx"밀어 넣으십시오.로컬 복제 사본에서 서브 모듈을 완전히 정리하려면 아래에 언급 된 추가 2 단계가 더 필요합니다.
.git/config파일 에서 해당 항목을 제거하십시오 . 아래에 언급 한 내용이있을 수 있습니다.[submodule "path_to_submodule"]
url = url_path_to_submodule
rm -rf .git/modules/path_to_submodule이 5 단계와 6 단계는 커밋이 필요한 변경 사항을 생성하지 않습니다.
git submodule deinit git-scm.com/docs/git-submodule#Documentation/…
git rm modulename하고rm -rf .git/modules/modulename