서브 모듈을 어떻게 제거합니까?


3539

Git 서브 모듈을 어떻게 제거합니까?

그건 그렇고, 내가 단순히 할 수없는 이유가 git submodule rm whatever있습니까?


109
간단한 답변 stackoverflow.com/a/21211232/94687 은 이제 올바른 답변 이므로 표시해야합니다. 이제 간단 git rm modulename하고rm -rf .git/modules/modulename
imz-Ivan Zakharyaschev 2016 년

10
사실이 아닙니다. 이 답변은에서 하위 모듈 항목을 제거하는 것을 다루지 않습니다 .git/config. 허용 된 답변은 하위 모듈을 완전히 제거하는 최신 방법을 보여줍니다. 또한이 답변에서 간결하게 설명되어 있습니다 : stackoverflow.com/a/36593218/1562138
fvgs

이 기사는 서브 모듈을 제거하는 데 매우 유용하다는 것을 알았습니다. .gitsubmodules 및 .git / config 파일 링크
Ri_

12
시간을 절약하고 직접 작동하는 답변 (2017 년)으로 바로 가십시오 : stackoverflow.com/a/36593218/528313
Vincenzo Pii

이틀 동안 서브 모듈 문제를 해결했습니다. 내가 이것을 발견했을 때 획기적인 일이 발생했습니다 : forums.developer.apple.com/thread/13102 . 기본적으로 Xcode 및 다른 앱은 '~'를 포함하는 URL을 확장하려고 애 쓰고 있습니다. ssh : //username@server.remoteHost.com/~/git/MyRepo.git을 ssh : //username@server.remoteHost.com/home/username/git/MyRepo.git로 변경하면 (실제 경로를 찾으십시오. 귀하의 서버에서), 모든 기묘함은 10 분 후에 사라졌습니다. 또한 참조 stackoverflow.com/questions/32833100/...
엘리스 밴 Looij에게

답변:


2213

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은 색인에서 제거합니다 :
    git rm --cached path_to_submodule(후행 슬래시 없음)
    특수 모드 "160000"으로 색인에 저장된 해당 디렉토리를 하위 모듈 루트 디렉토리로 표시합니다. .

마지막 단계를 잊고 하위 모듈을 일반 디렉토리로 추가하려고하면 다음과 같은 오류 메시지가 표시됩니다.

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} "$@"

18
사용법의 예를 들어 주실 수 있습니까 submodule deinit?
zakdances

5
@yourfriendzak은 여기를 성공적으로 사용하는 사람의 한 예입니다 : stackoverflow.com/a/16161950/6309 . 그러나 내가 처음 믿었던 것과 달리 1.8.3은 아직 릴리스되지 않았다는 것을 명심하십시오! 유닉스에서는 소스에서 컴파일 할 수 있습니다.
VonC

2
특별 항목 (디렉토리가 더 이상 서브 모듈입니다) 사라되어야하며,이 @HamishDowner .gitmodules확인을해야하지만, 난 더블 체크 아무 여전히 것 .git디렉토리 (즉, 지방 지역의 repo에서 설정, : 아니다 에 의해 수정 됨 git pull)
VonC 2016 년

2
@Jayen 예, .gitmodules항목의 제거와 색인의 특수 항목 제거를 커밋하고 해당 저장소를 푸시하면 다른 사람들 이 해당 항목을 가져와 하위 모듈이 사라집니다.
VonC

3
현재 git (v1.9 +)에서 일반 git rm submodule사람들은 이미 다른 사람들이 말했듯이 원하는 것을 정확하게 수행합니다.
피트 피터슨

3445

Git 서브 모듈 튜토리얼 페이지를 통해 :

서브 모듈을 제거하려면 다음이 필요합니다.

  1. .gitmodules파일 에서 관련 섹션을 삭제 하십시오.
  2. 스테이지 .gitmodules변경 :
    git add .gitmodules
  3. 에서 관련 섹션을 삭제하십시오 .git/config.
  4. 작업 트리 및 색인에서 하위 모듈 파일을 제거하십시오
    git rm --cached path_to_submodule(후행 슬래시 없음).
  5. 서브 모듈의 .git디렉토리를 제거하십시오 :
    rm -rf .git/modules/path_to_submodule
  6. 변경 사항을 커밋하십시오.
    git commit -m "Removed submodule <name>"
  7. 이제 추적되지 않은 서브 모듈 파일을 삭제하십시오.
    rm -rf path_to_submodule

참조 : 아래의 다른 단계를 .


410
"그리고 그건 그렇고, 단순히 서브 모듈 rm을 git 할 수없는 이유가 있습니까?" ?
abernier

48
@abernier curt 답변은 "이러한 명령이 없기 때문에"일 수 있습니다. 내 생각에 우연히 데이터 손실을 피하기 위해 서브 모듈 파일 대 서브 모듈 구성을 명시 적으로 제거하려고합니다. 아마도 한 사람은 git submodule rm단순히 서브 모듈 등록을 제거 한다고 생각 하고 명령이 로컬 리포지토리를 삭제하면 놀라게 될 것입니다. 모든 로컬 변경 사항은 복구 할 수 없을 정도로 손실됩니다. 그리고 아마도 다른 사람은 파일 만 제거 될 것이라고 생각할 것입니다.
John Douthat

119
솔직히, 나는 이유를 모른다. 그러나 그들이 명령을 추가하기를 바랍니다. 이 4 단계는 너무 복잡합니다.
John Douthat

25
서브 모듈을 제거하는 bash 스크립트는 다음과 같습니다. submodule-rm에 대한 git 별칭을 만드십시오.) gist.github.com/2491147
Capi Etheriel

33
또한 rm -rf .git \ modules \ submodule 이름이 필요합니까?
rogerdpack

484

그냥 참고하십시오. 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

5
git 버전 2.4.9 (Apple Git-60)를 사용 중이며 rm the_submodule 만 있으면됩니다. 그런 다음 하위 모듈과 동일한 이름의 폴더를 다시 추가했는데 문제없이 작동했습니다.
David Silva Smith

19
하위 모듈 항목은에서 제거되지 않습니다 .git/config. 서브 모듈을 완전히 제거하는 방법 은 stackoverflow.com/a/36593218/1562138 을 참조하십시오 .
fvgs

2
@drevicko 방금 Git 2.11.1로 이것을 테스트했으며 이전과 동일한 동작을 관찰합니다. 항목과 디렉토리 및 그 내용 git init && git submodule add <repository> && git rm <name>뒤에 남겨 둡니다 . 아마도 서브 모듈을 제거하기 전에 초기화하지 않았습니까? .git/config.git/modules/<name>
fvgs

2
git submodule deinit -f the_submodule
danday74

1
@JarrodSmith 예, 경로입니다. 업데이트를 참조하십시오.
tinlyx

478

이 질문에 대한 대부분의 답변은 구식이거나 불완전하거나 불필요하게 복잡합니다.

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

39
왜이 답변에 너무 많은 투표가 있습니까? 모든 인기있는 답변은 무언가를 놓쳤습니다. 이것은 가장 간단한 방법으로 서브 모듈의 모든 흔적을 실제로 제거하는 유일한 방법입니다. 그리고 참고 : 명령의 순서가 중요합니다.
mbdevpl

2
내 자신의 질문에 대답하려면 : stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Thomas

5
@mbdevpl은 승인 된 답변 후 3 년이 지났는데, 아무도 OP를 수락하도록 설득 할 수 없었습니다
Andy

10
이것은 2018 년에 복잡한 대답이 아닌가?
Warren P

9
.gitmodules의 파일은 여전히 이러한 명령을 실행 영향을받지 않는 것으로 보인다
Fractalf

206

간단한 단계

  1. 구성 항목을 제거하십시오.
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. 색인에서 디렉토리를 제거하십시오.
    git rm --cached $submodulepath
  3. 범하다
  4. 사용하지 않는 파일을 삭제하십시오.
    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 하위 모듈을 채울 수 있습니까?대한 답변도 살펴보십시오 . .


1
나는 많은 서브 모듈 (그리고 더 큰 혼란)을 가지고 있었으므로 for 루프를 통과해야했습니다. 그들 중 대부분은 특정 디렉토리와 ls 출력 아래에 슬래시가 포함되어 있기 때문에. 나는 같은 것을했다 for dir in directory/*; do git rm --cached $dir; done.
Pablo Olmos de Aguilera C.

이것을 재귀 적 삭제를 위해 스크립트에서 사용할 수있는 목록을 얻으려면--- 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
errordeveloper

2
로컬 변경 사항이없는 모듈 목록을 얻으려면 –git submodule | grep '^+' | cut -d' ' -f2
errordeveloper

참고, 나는 submodulename큰 따옴표로 묶어야했다 "submodulename".. .git/config파일 참조
muon

단순한. 실력 있는. 1 단계 이후 2.25.0에서는 2 단계 전에
.gitmodules

83

권장 사항 외에도 rm -Rf .git/modules/path/to/submodule동일한 이름의 새 하위 모듈을 추가 할 수 있어야했습니다 (제 경우에는 포크를 원본으로 교체했습니다)


1
나는 이것에도 문제가 있었다. 동일한 경로에 서브 모듈을 다시 설치하려고하면 브랜치 정보가 언급 한 위치에 캐시되어 유지됩니다.
jangosteve

고마워, 나도 이것이 필요했다. @Anton, 동의합니다.이 정보를 추가하기 위해 topvoted 답변을 편집했습니다.
윌리엄 데니스

나는 ... 바꾸기 작업을 볼 수 --name 옵션을 사용 stackoverflow.com/questions/14404704/...
joseph.hainline

60

다음을 사용하여 추가 된 서브 모듈을 제거하려면 다음을 수행하십시오.

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

1
실제로 +1. 이것은 git 1.8.3 이후의 유일한 정답입니다. 올바른 것으로 받아 들여 져야합니다.
Xananax

6
git rm여전히에 물건을 남깁니다 .git/modules/. (2.5.4)
Rudolf Adamkovič

1
@RudolfAdamkovic 그것은 나를 위해 작동합니까? 정확한 경로가 일치하면 하위 모듈 항목 만 제거합니다. 하위 모듈을 옮긴 다음 사용 git rm하지 않으면; 내 Mac에서 2.5.4로 빠른 테스트를 수행 하면 git-scm.com/docs/git-rm#_submodules ... 설명서에 설명 된대로 .gitmodules 파일이 업데이트 되지만 플랫폼의 조합을 발견 한 경우 / 이런 일이 발생하지 않는 버전에 대해서는 아마도 버그를 제기해야합니다.
Doug

2
이 답변은 완전히 정확하지 않습니다. 디렉토리와 파일에 git rm물건을 남깁니다 (우분투, 자식 2.7.4). 다른 답변 100 % 작동 : stackoverflow.com/a/36593218/4973698.git/modules/.git/config
mbdevpl

50

.gitmodules및 에서 항목을 제거하고 기록에서 .git/config모듈의 디렉토리를 제거 해야합니다 .

git rm --cached path/to/submodule

git의 메일 링리스트에 글을 쓰면 누군가가 쉘 스크립트를 만들 것입니다.


쉘 스크립트가 필요하지 않습니다. 다른 답변에는 하위 모듈의 모든 흔적을 제거하는 명령이 있습니다. stackoverflow.com/a/36593218/4973698
mbdevpl

42

별명을 사용하여 다른 사람이 제공 한 솔루션을 자동화 할 수 있습니다.

[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


-1 너무 잘못되었습니다. FIRST :이 서브 모듈의 이름과 경로가 동일하다고 가정 대부분의 경우하지 않은 . IE 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.
티노

42

요약하면 다음과 같습니다.

  1. path_to_submodulevar 설정 (슬래시 없음) :

    path_to_submodule=path/to/submodule

  2. .gitmodules 파일에서 관련 행을 삭제하십시오.

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. .git / config에서 관련 섹션을 삭제하십시오.

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. 인덱스에서 $ path_to_submodule을 스테이지 해제하고 제거하여 정보 손실

    git rm --cached $path_to_submodule

  5. .gitmodule에 대한 변경 사항 추적

    git add .gitmodules

  6. 슈퍼 프로젝트 커밋

    git commit -m "Remove submodule submodule_name"

  7. 지금 추적되지 않은 서브 모듈 파일 삭제

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule


따라서 변경 사항을 풀고 다른 사람은 하위 모듈 캐시를 제거하려면 rm -rf $ path_to_submodule rm -rf .git / modules / $ path_to_submodule을 실행해야합니까?
j2emanue

업데이트하는 것이 좋습니다 git submodule update. 하위 모듈 경로가 올바르게 업데이트되지 않은 경우 (git에서 오류가 발생 함) 제거하십시오.rm -rf .git/modules/<submodule> && rm -rf <submodule> && git submodule update
luissquall

40

이미 Git 리포지토리 (포함 ) 인 폴더를 추가, 커밋 및 푸시 하여 하위 모듈이 실수로 추가 된 경우 편집 할 파일 .git이 없거나에 .gitmodules파일 이 없습니다 .git/config. 이 경우 필요한 것은 다음과 같습니다.

git rm --cached subfolder
git add subfolder
git commit -m "Enter message here"
git push

FWIW , 나는 또한 .git폴더를 제거 하기 전에 폴더를 제거 했습니다 git add.


정확히 나의 경우
zhekaus

37

나는 deinit나에게 좋은 작품을 발견했다 .

git submodule deinit <submodule-name>    
git rm <submodule-name>

에서 자식 문서 :

초기화 해제

주어진 서브 모듈의 등록을 해제하십시오. 즉, submodule.$name 작업 트리와 함께 .git / config에서 전체 섹션을 제거하십시오 .


동의하면 같은 해결책을 찾았습니다. 2018 년 오늘 가장 좋은 방법입니다)
woto

1
.git / modules / ..를 제거하지 않았습니다. 당신은 @fvgs으로 대답 참조를 제거해야합니다
빌렘 커즈

이 간단하고 쉬운 솔루션이 1이 아닌 이유를 모릅니다
Marc Magon

AFAICS이는 것 같다 새로운 가장 안전한 대답 git 아는 deinit바와 같이, 다른 대답은 제거 .git/modules/submodule너무 일찍 디렉토리를 새로운하게 보인다, gits는 현재 또는 다음 실패 할. 또한 (내 의견 참조) 제거 .git/modules/submodule가 잘못된 경로 일 수 있으므로이 단계는 위험한 단계이며 나중에 git불만을 제기 할 때만 취하는 것이 가장 좋습니다 (또는 원하는 299 % 확신하는 경우 올바른 경로이며 실제로 필요합니다).
티노

나는 또한 필요한 git commit디렉토리 작업에서 개최 변경 사항을 적용하려면 다음 modified .gitmodulesdeleted <submodule-path>.
유리 Pozniak

20

이 사이트에서 다른 모든 답변을 실험 한 후이 솔루션을 사용했습니다.

#!/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
bfontaine

-1 하위 모듈 내에서 하위 모듈을 제거하려고하면 작동하지 않습니다 (서브 모듈은 트리를 형성 할 수 있습니다!). 또한 인용이 누락되어 위험합니다 . 예 git submodule add https://github.com/hilbix/empty.git 'dangerous .. submodule'-> 스크립트를 사용하여 '위험한 .. 서브 모듈'을 제거하려고 할 때, 이것은 rm -rf ..아마도 당신이 원하는 것이 아닐 것입니다 ..
Tino

17

내가 현재 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}"

15

여기 내가 한 일이 있습니다.

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

고마워 나를 위해 처음 세 단계 순서를 3), 1), 2)로 다시 정렬해야했습니다. 1)을하는 것은 먼저 fatal: no submodule mapping found in .gitmodules for path 'submodule_name'단계 3에서 주었다 . 그러나 두 단계 모두 필요했다. (git v2.8.2)
U007D

13

나는 최근에 유용한 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
티노

10

John Douthat의 단계를 한 단계 더 나아가서 cd서브 모듈의 디렉토리로 가져간 다음 Git 저장소를 제거해야했습니다.

cd submodule
rm -fr .git

그런 다음 하위 모듈에 대한 이전 참조없이 부모 Git 저장소의 일부로 파일을 커밋 할 수 있습니다.


git rm --cache단계 를 수행하려고 할 때 "치명적 : 자식 저장소가 아닙니다 :"오류를 극복하기 위해이 작업을 수행해야했습니다 .
RickDT

9

필요하거나 유용한 것으로 밝혀진 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 rm1 단계 알아서해야한다. 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 단계를 수행하는지 여부에 관계없이 적용됩니다.


7
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

7

방금 .submodule (정확한 이름을 잊어 버렸습니다) 숨겨진 파일을 찾았습니다. 목록이 있습니다 ... 그러면 개별적으로 삭제할 수 있습니다. 방금 하나 가지고 있었으므로 삭제했습니다. 간단하지만 서브 모듈에 무엇이 부착되어 있는지 알 수 없으므로 Git을 망칠 수 있습니다. libetpan의 일반적인 업그레이드 문제를 제외하고는 지금까지는 괜찮아 보이지만 관련이 없습니다.

아무도 수동 지우기를 게시하지 않았으므로 추가되었습니다.


그것은이다.gitmodules
아리 알도 마티니

7

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 .
티노

4

하위 모듈을 방금 추가 한 경우 (예 : 잘못된 하위 모듈을 추가했거나 잘못된 위치에 추가 git stash한 경우) 폴더를 삭제하면됩니다. 하위 모듈을 추가하는 것이 최근 리포지토리에서 수행 한 유일한 작업이라고 가정합니다.


3

독자의 이익을 위해 여기에 요약하여 문제가 예상대로 작동하지 않는 경우 어떻게 수행하는지 단계별 가이드를 제공합니다. 다음은 하위 모듈을 제거하기 위해 버전 이상 에서 테스트되고 안전한 방법 입니다 .git2.17

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • 그래도 문제가 해결되지 않으면 아래를 참조하십시오.
  • 옵션이 없습니다. 위험한 것은 없습니다. 그리고 더 많은 것을 고려하지 마십시오!
  • 데비안 버스터 2.20.1와 우분투에서 테스트 18.042.17.1 .
  • "$submodule" 이름을 어디에 두어야하는지 강조하는 것입니다. 공백 등을 조심해야합니다.
  • Windows에서 첫 번째 행을 무시 "$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
    • (1) 업데이트 .git/config
  • git rm
    • (2) 모듈의 파일을 제거합니다
    • (3) 서브 모듈의 서브 모듈을 재귀 적으로 제거
    • (4) 업데이트 .gitmodules
  • git submodule add
    • 데이터를 가져옵니다 .git/modules/NAME/
    • (1) git submodule init이므로 업데이트.git/config
    • (2)는 git submodule update비재 귀적으로 모듈을 체크 아웃합니다.
    • (4) 업데이트 .gitmodules
  • git submodule update --init --recursive -- module
    • 필요한 경우 추가 데이터를 가져옵니다
    • (3) 서브 모듈의 서브 모듈을 재귀 적으로 체크 아웃

엄격하게 대칭을 유지하는 것은 의미가 없으므로 완전히 대칭이 될 수는 없습니다. 단순히 두 개 이상의 명령이 필요하지 않습니다. 또한 "데이터 풀링 (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다시 정리할 때까지 정리하십시오. 첫 단계 덕분에 이전에 깨끗해 졌기 때문에 그렇게 할 수 있습니다.

이것은 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이 저장되지 않은 것들에 대해 불평한다면, 안전한 곳으로 옮기고 밀어 넣으십시오.
  • 자식은 어떤 먹다 남은 음식에 대해 불평하는 경우 git statusgit 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/ 서로 다른 두 개의 상류 저장소가 있기 때문에 다시문제가 발생하지 않습니다. 가장 좋은 방법은 다음과 같습니다. 둘 다 로컬에 캐시 된 상태로 유지합니다.

  • 이것은 당신에게만 해당되는 것은 아닙니다. 또한 저장소를 사용하는 다른 모든 사람들에게도 해당됩니다.
  • 그리고 당신은 역사를 잃지 않습니다. 최신 하위 모듈의 최신 버전을 푸시하는 것을 잊어 버린 경우 로컬 사본을 입력하고 나중에 그렇게 할 수 있습니다. 누군가가 일부 하위 모듈을 푸시하는 것을 잊어 버리는 것이 일반적입니다 (이것은 초보자가 익숙해지기 전까지는 PITA이기 때문에 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 계정입니다.


게시물의이 백과 사전은 실제 답변과 다른 "문제 해결"/ etc 섹션을 나타 내기 위해 더 크고 명확한 소제목이있는 더 명확한 섹션으로 나누어 져야합니다.
앤드류

2

요약하면 다음과 같습니다.

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 add'다음에 서브 모듈을 제거하는 방법으로 확장 할 수 있습니까? 이 경우 하위 모듈을 제거하는 데 커밋이 필요하지 않다고 가정합니다.
Carlo Wood

난 당신이 교환하지 필요가 있다고 생각 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첫 번째 작업을 수행하면 문제가 해결됩니다.
Carlo Wood

2

간단합니다.

  1. 에서 섹션을 제거 .gitmodules
  2. 요구: git add .gitmodules
  3. 요구: git submodule deinit <path to submodule>
  4. 요구: git rm <path to submodule>
  5. 커밋과 푸시

프로젝트에서 모듈 파일을 수동으로 삭제해야합니다.


2
나에게는 전화를 충분 git submodule deinit <submodule_name>하고 git rm <path_to_submodule>. 마지막 명령은의 내부 항목을 자동으로 삭제합니다 .gitmodules. 힘내 2.17
Dmytro Ovdiienko


0

최신 git에서는 git 서브 모듈을 제거하기 위해 4 작업 만 필요합니다.

  • 에서 해당 항목 제거 .gitmodules
  • 스테이지 변경 git add .gitmodules
  • 서브 모듈 디렉토리를 제거하십시오 git rm --cached <path_to_submodule>
  • 커밋 git commit -m "Removed submodule xxx"

0

아래와 같이 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


0
  • 를 실행하여 하위 모듈을 삭제할 수 있습니다 git rm <submodule path> && git commit. 을 사용하여 취소 할 수 있습니다 git revert.
    • 삭제하면 수퍼 프로젝트의 추적 데이터 (gitlink 항목 및 .gitmodules파일 의 섹션)가 제거 됩니다.
    • 서브 모듈의 작업 디렉토리는 파일 시스템에서 제거되지만 Git 디렉토리는 다른 저장소에서 가져 오지 않고도 과거의 커밋을 체크 아웃 할 수 있도록 유지됩니다.
  • 하위 모듈을 완전히 제거하려면 추가로 수동으로 삭제하십시오$GIT_DIR/modules/<name>/ .

출처: git help submodules


-1

자식 서브 모듈 제거

git하위 모듈 을 제거하려면 4 단계가 필요합니다.

  1. .gitmodules파일 에서 해당 항목을 제거하십시오 . 아래에 언급 된 것과 같은 항목이있을 수 있습니다.
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. 스테이지 변경 git add .gitmodules
  2. 서브 모듈 디렉토리를 제거하십시오 git rm --cached <path_to_submodule>.
  3. 그것을 저지르고 git commit -m "Removed submodule xxx"밀어 넣으십시오.

로컬 복제 사본에서 서브 모듈을 완전히 정리하려면 아래에 언급 된 추가 2 단계가 더 필요합니다.

  1. .git/config파일 에서 해당 항목을 제거하십시오 . 아래에 언급 한 내용이있을 수 있습니다.
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. 하다 rm -rf .git/modules/path_to_submodule

이 5 단계와 6 단계는 커밋이 필요한 변경 사항을 생성하지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.