문제

Git 하위 모듈을 어떻게 제거합니까?

그런데, 내가 단순히 할 수 없는 이유가 있는 걸까?git submodule rm whatever ?

도움이 되었습니까?

해결책

부터 git1.8.3(2013년 4월 22일):

하위 모듈에 대한 관심을 "로 표현하면 더 이상 이 하위 모듈에 관심이 없습니다"라고 말하는 도자기 방식은 없었습니다.submodule init".
"submodule deinit"라는 방법이 있습니다.

삭제 프로세스에서는 다음을 사용합니다. git rm (2013년 10월 git1.8.5 이후).

요약

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:이는 다음에서 언급됩니다. 다니엘 슈뢰더'에스 답변, 요약 언일 ~에 댓글:

이것은 떠난다 .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' 하위 모듈의 URL을 기록하는 단계 .gitmodules 파일:그것은 당신을 위해 제거될 필요가 있습니다.
  • 서브모듈 특별입장 (그림과 같이 이 질문):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(2018년 2분기)부터 git 하위 모듈 deinit는 더 이상 쉘 스크립트가 아닙니다.
C 함수에 대한 호출입니다.

보다 커밋 2e61273, 커밋 1342476 (2018년 1월 14일) 프라타메시 차반(pratham-pc).
(병합자: 주니오 C 하마노 -- gitster -- ~에 ead8dbe를 커밋하다, 2018년 2월 13일)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

다른 팁

페이지를 통해 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

또한보십시오: 아래의 대체 단계.

그냥 메모. GIT 1.8.5.2 이후 두 가지 명령이 수행됩니다.

git rm the_submodule
rm -rf .git/modules/the_submodule

@Mark Cheverton의 답변이 올바르게 지적되었으므로, 두 번째 줄이 사용되지 않으면, 현재 하위 모듈을 제거하더라도 Remnant .git/modules/the_submodule 폴더는 동일한 서브 모드가 추가되거나 향후 교체되는 것을 방지합니다. . 또한 @VONC가 언급했듯이 git rm 하위 모듈에서 대부분의 작업을 수행합니다.

-Update (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 1.7.8 또는 최신을 사용하여 복제 된 하위 모듈은 지역 리포에 최대 4 개의 흔적을 남길 것입니다. 이 네 가지 흔적을 제거하는 프로세스는 아래 세 가지 명령에 의해 제공됩니다.

# 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

간단한 단계

  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 하위 모듈을 인사하지 않습니까?.

권장 사항 외에도 rm -Rf .git/modules/path/to/submodule 같은 이름의 새 하위 모듈을 추가 할 수 있으려면 (제 경우에는 포크를 원본으로 대체하고있었습니다)

다음을 사용하여 추가 된 하위 모듈을 제거합니다.

git submodule add blah@blah.com:repos/blah.git lib/blah

운영:

git rm lib/blah

그게 다야.

기존 버전의 git (circa ~ 1.8.5)의 경우 :

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

항목을 제거해야합니다 .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 구성에 넣으면 다음을 수행 할 수 있습니다. git rms path/to/submodule

요약하면, 이것이 당신이해야 할 일입니다.

  1. 세트 path_to_submodule var (후행 슬래시 없음) :

    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. .gitModules로 변경된 변경 사항을 추적합니다

    git add .gitmodules

  6. SuperProject를 커밋하십시오

    git commit -m "Remove submodule submodule_name"

  7. 지금 추적되지 않은 하위 모듈 파일을 삭제하십시오

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

하위 모듈이 있다면 우연히 이미 GIT 저장소 인 폴더를 추가, 커밋 및 밀어 넣었 기 때문에 추가 .git), 당신은 없습니다 .gitmodules 편집 할 파일 또는 .git/config. 이 경우 필요한 모든 경우 이다 :

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

fwiw, 나는 또한 그것을 제거했다 .git 작업하기 전에 폴더 git add.

나는 찾았다 deinit 나를 위해 잘 작동합니다 :

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

에서 git 문서:

Deinit

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

이 사이트의 모든 다른 답변을 실험 한 후이 솔루션으로 끝났습니다.

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

내가 현재하고있는 일 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

최근에 많은 유용한 GIT 관련 명령이 포함 된 GIT 프로젝트를 찾습니다. https://github.com/visionmedia/git-extras

설치하고 입력하십시오.

git-delete-submodule submodule

그런 다음 일이 끝났습니다. 하위 모듈 디렉토리는 repo에서 제거되어 파일 시스템에 여전히 존재합니다. 그런 다음 다음과 같은 변경 사항을 커밋 할 수 있습니다. git commit -am "Remove the submodule".

John Douthat의 발걸음을 한 단계 더 발전시켜야했고 cd 하위 모듈의 디렉토리로 들어간 다음 git 저장소를 제거하십시오.

cd submodule
rm -fr .git

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

다음은 필요하거나 유용한 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/ 그렇지 않으면 예를 들어 앞으로 하위 모듈을 추가 할 수 없습니다.

아마도 GIT 1.8.5+의 위의 두 단계로 도망 갈 수 있습니다. 틴스의 대답 모두처럼 언급했습니다 git submodule 명령이 작동하는 것 같습니다.

3 단계는 섹션을 제거합니다 the_submodule 파일에서 .git/config. 이것은 완전성을 위해 이루어져야합니다. (항목은 구형 GIT 버전에 문제가 발생할 수 있지만 테스트 할 것이 없습니다).

이를 위해 대부분의 답변은 사용 제안을 제안합니다 git submodule deinit. 나는 그것이 더 명백하고 덜 혼란 스럽다는 것을 알았습니다. git config -f .git/config --remove-section. 에 따르면 git-submodule 문서, git deinit:

주어진 하위 모듈을 등록 해제하십시오 ... 저장소에서 하위 모듈을 제거하고 GIT-RM을 사용하는 커밋 [1 대신에.

마지막으로, 그렇지 않은 경우 git commit, 당신은 할 때 오류가 발생할 수 있습니다. git submodule summary (GIT 2.7 기준) :

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

방금 .submodule (정확한 이름을 잊어 버린) 숨겨진 파일을 발견했습니다. 목록이 있습니다 ... 그런 식으로 개별적으로 지울 수 있습니다. 방금 하나 있었으므로 삭제했습니다. 단순하지만, 하위 모듈에 어떤 것이 첨부되어 있는지 모르기 때문에 git을 엉망으로 만들 수 있습니다. 지금까지 Libetpan의 일반적인 업그레이드 문제와는 달리 괜찮아 보이지만 (희망적으로) 관련이 없습니다.

아무도 수동 지우기를 게시 한 사람이 없다는 것을 알았습니다

하위 모듈을 방금 추가 한 경우 예를 들어, 단순히 잘못된 하위 모듈을 추가하거나 잘못된 장소에 추가 한 경우 간단히 git stash 그런 다음 폴더를 삭제합니다. 이것은 하위 모듈을 추가하는 것이 최근 저장소에서 한 유일한 일이라고 가정합니다.

GIT 2.17 이상으로 그것은 단지 다음과 같습니다.

git submodule deinit -f {module_name}
git add {module_name}
git commit

제거 프로세스를 쉽게 하기 위해 bash 스크립트를 만들었습니다.또한 저장소에 저장되지 않은 변경 사항이 있는지 확인하고 확인을 요청합니다.그것은 테스트되었습니다 os x 일반적인 Linux 배포판에서도 작동하는지 아는 것이 흥미로울 것입니다.

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

최신 GIT에서는 GIT 하위 모듈을 제거하려면 4 개의 작업 만 필요합니다.

  • 해당 항목을 제거하십시오 .gitmodules
  • 무대 변경 git add .gitmodules
  • 하위 모듈 디렉토리를 제거하십시오 git rm --cached <path_to_submodule>
  • 커밋하십시오 git commit -m "Removed submodule xxx"

당신이 그것을 해야하는 경우 하나의 라인 명령 아래와 같이 bash 스크립트를 사용하여 :

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

에서 Bash 스크립트 파일을 만듭니다 $HOME IE라는 이름의 DIR 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top