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 rm
git1.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_submodule
git 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.$submodulename
git config -f .gitmodules --remove-section submodule.$submodulename
git rm --cached $submodulepath
rm -rf $submodulepath
rm -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_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 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 $path
git 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
.
독자의 이익을 위해 여기에 요약하여 문제가 예상대로 작동하지 않는 경우 어떻게 수행하는지 단계별 가이드를 제공합니다. 다음은 하위 모듈을 제거하기 위해 버전 이상 에서 테스트되고 안전한 방법 입니다 .git
2.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/config
git rm
.gitmodules
git submodule add
.git/modules/NAME/
git submodule init
이므로 업데이트.git/config
git submodule update
비재 귀적으로 모듈을 체크 아웃합니다..gitmodules
git 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@othermachine
othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
othermachine:~/TMPWORK$ git commit . -m . && exit
workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD
. 그래도 문제가 해결되지 않으면git reset --soft FETCH_HEAD
git status
다시 정리할 때까지 정리하십시오. 첫 단계 덕분에 이전에 깨끗해 졌기 때문에 그렇게 할 수 있습니다.이것은 othermachine
VM이거나 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
첫 번째 작업을 수행하면 문제가 해결됩니다.
간단합니다.
.gitmodules
git add .gitmodules
git 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
$HOME
dir 디렉토리 에 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 .gitmodules
git 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