programing

서브모듈을 분리하려면 어떻게 해야 하나요?

megabox 2023. 4. 24. 23:01
반응형

서브모듈을 분리하려면 어떻게 해야 하나요?

Git ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★?git submodule rm module_name

git (된 modern git(2022년 갱신)으로git인스톨)이 매우 심플하게 되었습니다.

  • 를 실행하고 커밋합니다.

됩니다.<path-to-submodule>가 「」에 .gitmodules파일. 즉, 저장소 내 적절한 하위 모듈의 모든 흔적이 제거됩니다.

다만, 문서에서는,.git는 ('디르'(dir)의 됩니다.modules/.gitdir) "다른 저장소에서 가져올 필요 없이 과거의 커밋을 체크아웃할 수 있도록 합니다."
이 에 있는 합니다..git/modules/.git/config는, 할 수 있습니다.

  • rm -rf .git/modules/<path-to-submodule> , 그리고.
  • git config --remove-section submodule.<path-to-submodule>.


오래된 커뮤니티 Wiki 설명:

Git 서브모듈 튜토리얼 페이지 경유:

서브모듈을 삭제하려면 다음 작업을 수행해야 합니다.

  1. 해 주세요..gitmodulesfilename을 클릭합니다.
  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

다음 대체 단계참조하십시오.

git1.8.3(2013년 4월 22일) 이후:

"이 더말할 수 . "이 에 대한 하면 "이 서브모듈에 더 이상 관심이 없습니다"라고할 수 있습니다git submodule init
"git submodule deinit가 그렇게 하는 방법입니다.

에서는 「」도 합니다.git rm(2013년 10월 1.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이는 다니엘 슈뢰더의 답변에서 언급되고 Eonil코멘트에서 요약했다.

하면 남는다.git/modules/<path-to-submodule>/변경되지 않았습니다.
따라서 이 메서드로 서브모듈을 일단 삭제하고 다시 추가하면 저장소가 이미 손상되었기 때문에 다시 추가할 수 없습니다.


git rm: commit 95c16418참조해 주세요.

는 '이렇게 하다'를사용하고 있습니다.git rm서브모듈의 경우 서브모듈의 워크트리를 슈퍼프로젝트의 워크트리에서 삭제하고 Gitlink를 인덱스에서 삭제합니다.
, 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」.gitmodules는 변경되지 않은 로 남아 있습니다. 할 수 (사용자의 ).이는 현재 제거된 서브모듈의 잔여물이며 사용자를 자극할 수 있습니다(의 설정과 반대)..git/config이는 사용자가 이 서브모듈에 관심을 보인 것을 알려주는 것으로, 오래된 커밋이 체크아웃 되었을 때 다시 입력되도록 해야 합니다).

」로 해 주세요.git rm했을 뿐만 "Submodule"을submodule.<submodule name> 」의 「 」의 항을 참조..gitmodules파일 및 스테이지를 모두 지정합니다.


git submodule deinit: 이 패치에 기인합니다.

"와 함께git submodule init에 대해 을 가지고 , 에 입력하기를 원할 수 git submodule update
트리를 수 있는 정보를 "submodule"을 하지 않는 한).submodule.$name.url " "에서 .git/config」를 참조해 주세요.

"deinit 명령어를 제공하여 사용자를 지원합니다.
그러면 특정 서브모듈(또는 초기화된 모든 서브모듈)의 섹션 전체가 삭제됩니다..가 지정됩니다).
강제하지 않는 한 현재 작업 트리에 수정 사항이 포함되어 있으면 실패합니다.
을 URL에서 수 없는 합니다..git/config이치노

(de) 단계de')에 주의합니다..git/config ★★★★★★★★★★★★★★★★★」.git/modules/xxx)

부터 git1.8.5부터git rm는 다음 사항도 처리합니다.

  • add을 'URL'에 .gitmodules파일: 삭제해야 합니다.
  • submodule 특수 엔트리(이 질문으로 설명): 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 함수에 대한 호출입니다.

Prathamesh Chavan()pratham-pc의 commit 2e61273, commit 1342476(2018년 1월 14일)을 참조하십시오.
(2018년 2월 13일, Junio C Hamano에 의해 합병)

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

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

git 1.7.8 이후를 사용하여 복제한 서브모듈은 로컬 레포에 최대 4개의 흔적을 남깁니다.이들 4개의 트레이스를 삭제하는 프로세스는 다음 3개의 명령어로 이루어집니다.

# 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 1.8.5.2 이후, 다음의 2개의 커맨드로 동작합니다.

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

@Mark Cheverton의 답변이 옳았듯이, 두 번째 줄을 사용하지 않을 경우, 현재 서브모듈을 삭제하더라도 나머지 .git/modules/the_submodule 폴더는 동일한 서브모듈을 나중에 다시 추가하거나 교체하는 것을 방지합니다.와 같이 @VonC는git rm서브모듈에서 대부분의 작업을 수행합니다.

--업데이트 (07/05/2017)--

하자면, 실실 just just just just just just just just just just justthe_submodule프로젝트 내 서브모듈의 상대 경로입니다.예를 들어서subdir/my_submodule 내에 subdir.

코멘트 및 기타 답변에서 올바르게 지적된 바와 같이 2개의 명령어(기능적으로는 서브모듈을 삭제하기에 충분하지만)는 에 트레이스를 남깁니다.[submodule "the_submodule"].git/config) 세 명령을 할 수 (2017년 7월 현재).

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

간단한 순서

  1. "이것들"은 다음과 같습니다.
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. 「CHANGE MANGE:」
    git rm --cached $submodulepath
  3. 저지르다
  4. "CHANGE: "CHANGE:
    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 및 일 first first firstgit commit마지막에 이걸 대본에 넣으면

또한 "Git 서브모듈을 채울 수 있나요?"에 대한 답변을 참조하십시오.

추가한 서브모듈을 삭제하려면 다음 명령을 사용합니다.

REPOSITORY=blah@blah.com:repos/blah.git
MOD_DIR=lib/blah
git submodule add $REPOSITORY $MOD_DIR

실행:

git rm $MOD_DIR

바로 그겁니다.

git의 이전 버전(circa~1.8.5, 실제로는 2.26.2)의 경우 다음을 사용합니다.

git submodule deinit $MOD_DIR
git rm $MOD_DIR
git config -f .gitmodules --remove-section submodule.$MOD_DIR

저는 추천뿐만 아니라rm -Rf .git/modules/path/to/submodule할 수 내는 원래 ).

해야 합니다..gitmodules ★★★★★★★★★★★★★★★★★」.git/config이치노

git rm --cached path/to/submodule

만약 당신이 git의 메일링 리스트에 글을 쓴다면 아마도 누군가가 당신을 위해 셸 스크립트를 해줄 것입니다.

deinit과가있있 있있있다다

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

git docs에서:

결점

을 해제합니다. 모든 서브모듈을 합니다.submodule.$namedisc/config 섹션이 함께 됩니다.

별칭을 사용하여 다른 사용자가 제공하는 솔루션을 자동화할 수 있습니다.

[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. 슈퍼프로젝트 커밋

    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.

  1. git submodule deinit <path to submodule>
  2. 을 삭제해 ..gitmodules
  3. git rm <path to submodule>
  4. 프로젝트에서 제거해야 하는 모듈 파일을 삭제합니다.
  5. 하여 git으로 호출합니다.git add .gitmodules
  6. 커밋 및 푸시

이 사이트에서 다양한 답변을 시험해 본 결과, 다음과 같은 솔루션을 얻을 수 있었습니다.

#!/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}"

저는 최근에 유용한 git 관련 명령어가 많이 포함된 git 프로젝트를 발견했습니다: https://github.com/visionmedia/git-extras

인스톨 해, 다음과 같이 입력합니다.

git-delete-submodule submodule

파일시스템에 합니다.서브모듈 디렉토리는 repo에서 삭제되고 파일시스템에 계속 존재합니다. 다음과 같이 수 있습니다.git commit -am "Remove the submodule".

제가 한 일은 다음과 같습니다.

1) .gitmodules 파일에서 관련 섹션을 삭제합니다.다음 명령을 사용할 수 있습니다.

git config -f .gitmodules --remove-section "submodule.submodule_name"

2) 스테이지 ★★★★.gitmodules 사항 ''"

git add .gitmodules

3)을 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

독자의 이익을 위해서, 이것은 그것을 요약하고, 일이 예상대로 되지 않는 경우에 그것을 실행하는 방법에 대한 단계별 가이드를 제공하려고 합니다.테스트되고 안전한 방법은 다음과 같습니다.git2.17서브모듈을 삭제하려면 다음 절차를 수행합니다.

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • 이 방법으로 동작하지 않는 경우는, 이하를 참조해 주세요.
  • 옵션은 없습니다.위험하지 않아요.그리고 더 이상 할 생각은 하지도 마!
  • Debian Buster로 2.20.1 Ubuntu © Ubuntu 18.042.17.1.
  • "$submodule"에 붙여야 , , 를 조심해야 한다, 띄어쓰기를 해야 한다, .
  • 의 는, 첫 하고, 의 「」, 「」, 「」, 「」를 치환합니다."$submodule"Windows 를)저저를를를를저저저저저저저저저가저)))))) 。

경고!

디렉토리 내부를 직접 만지지 마십시오!내부 편집.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) (1) ★★.git/config
  • git rm
    • (2) 모듈의 파일을 삭제합니다.
    • (3) 서브모듈의 서브모듈을 재귀적으로 제거한다.
    • ) (4) ★.gitmodules
  • git submodule add
    • .git/modules/NAME/
    • (1)은 (1)을 하다git submodule init, "".git/config
    • (2는 과 같이 한다git submodule update 아웃합니다.
    • ) (4) ★.gitmodules
  • git submodule update --init --recursive -- module
    • 필요에 따라 추가 데이터 가져오기
    • (3) 서브모듈의 서브모듈을 재귀적으로 체크한다.

엄밀하게 대칭을 유지하는 것은 의미가 없기 때문에 이것은 완전히 대칭일 수 없습니다.명령어를 3개 이상 사용할 필요는 없습니다.또, 「데이터의 풀인」은, 필요하기 때문에 암묵적으로 행해지고 있습니다만, 캐시된 정보를 삭제하는 것은 전혀 필요 없고, 귀중한 데이터가 삭제될 가능성이 있기 때문에 행해지지 않습니다.

보는 사람에게는 곤혹스럽지만, 으로는 좋은 것이다.git당연한 일을 하고 옳은 일을 할 뿐이지 더 이상 하려고 하지도 않는다. git단순한 '에어레젠드 월밀샤우'가 아닌 '에어레젠드 월밀샤우'가 아니라 '스위스 군용 칼의 사악한 버전'이라는 의미입니다.

는 '안 하느냐'는요. "어디로요?"git당연한 것"이라고 말했다.왜냐하면 여기서 "명확한" 것은 관점에 따라 달라지기 때문이다.모든 상황에서 신뢰성이 훨씬 더 중요합니다.따라서 가능한 모든 기술적 상황에서 적절한 것은 아닌 경우가 많습니다.: AFAICS icsics please : AFAICSgit경로를 ( name: follows follows follows follows follows follows follows follows follows follows follows follows git git git git git git git git git그 ( git )

이것이 실패했을 경우

위의 명령어는 다음과 같은 이유로 실패할 수 있습니다.

  • 의 ★★★★★★★★★★★★★★★★★.git그럼 좀 더 새로운 것을 쓰세요.git ( ( ( ) 。
  • 커밋되지 않은 데이터가 있으며 데이터가 손실될 수 있습니다.그럼 그들을 먼저 투입하는 게 좋을 거야
  • .git clean (아래 (일부러)
  • 은 과거에 못하는 .git그러면 당신은 어두운 편에 서게 되고 상황은 더 험악해지고 복잡해집니다.(아마 다른 기계로 수정될 것입니다.)
  • 내가이 더 몇 가지 있을 뿐이다).git★★★★★★★★★★★★★★★★★★」

생각할 수 있는 수정은 다음과 같습니다.

「」를 합니다.git

.submodule deinit 안에서git않는 할 수 있는 )git로 바꿔서 gitgit는 완전하고 있기 에 다른 할 수 .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및 stick.directory)에서 클론을 합니다.복사본을 복제하여 다시 깔끔하게 만듭니다.서브모듈에 다른 머신에서 직접 액세스할 수 없는 경우 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은 다음과 같습니다.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 needed needed 。submodule deinit깨끗한 상태라면git clean해 주세요. 또한 주의해 주세요.git clean -x는 불필요합니다.이는 무시된 추적되지 않은 파일을 무조건 제거하는 것을 의미합니다.이것은 보통 당신이 원하는 것이지만, 잊지 마세요.캐시된 데이터가 다시 계산되는 데 몇 시간에서 며칠이 걸리는 등 무시된 파일이 중요한 경우가 있습니다.

" remove"는 삭제하지 않는가?$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 에서 재인스톨 하면, 표시되지 않습니다.

제제어 떻???use use use! 사용법 사용법--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/2개의 서로 다른(호환할 수 없는) 업스트림저장소가 있습니다.가장 좋은 점은 둘 다 로컬로 캐시할 수 있다는 것입니다.

  • 이것은 당신에게만 해당되는 것이 아닙니다.또한 저장소를 사용하는 다른 모든 경우에도 해당됩니다.
  • 을 사용법오래된 서브모듈의 최신 버전을 푸시하지 않은 경우 로컬복사를 입력하고 나중에 푸시할 수 있습니다.위한 에 PITA에 까지).git를 참조해 주세요.

이 발생합니다.는 "C"를 사용하지 때문입니다.이는 사용자가 캐시된 디렉토리를 사용하지 않기 때문입니다.--name이죠? 그래서 을 할 마다 삭제가 필요할 ..git/modules/<module>/디렉토리가 몇 번이고 반복됩니다.은 매우 , 어렵습니다.git bisect.

따라서 이 모듈 디렉토리를 플레이스 홀더로 유지해야 하는 매우 기술적인 이유가 있습니다.에 있는 .git/modules/더 잘 알지 못하거나 이것이 다음과 같은 강력한 기능을 만든다는 것을 말하는 것을 잊거나 둘 중 하나입니다.git bisect이러한 서브모듈의 비호환성을 넘으면 거의 사용할 수 없습니다.

이랬다, 여기 보세요.ls기기뭐 가가?

의 두 two/ 속하지 않다.git/modules/two/ ..git/modules/someunusedname/! !서......git rm $module; rm -f .git/module/$module★★★★★★★★★★★★★★★★★! 중 해야 합니다.module/.git ★★★★★★★★★★★★★★★★★」.gitmodules제거할 수 있는 적절한 것을 찾을 수 있습니다!

그래서 대부분의 다른 답변이 이 위험한 함정에 빠질 뿐만 아니라 매우 인기 있는 확장자들도 버그를 가지고 있습니다(현재 이 버그는 거기에 고정되어 있습니다).그러니 손 떼는 게 좋을 거야.git/디렉토리(정확하지 않은 경우)를 참조해 주세요.

그리고 철학적인 관점에서 역사를 지우는 것은 항상 잘못된 것이다!양자역학은 예외지만 이건 완전히 달라요

참고로 짐작하셨을 겁니다.힐빅스는 제 GitHub 계정입니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 버전 git을 사용하고 .2.28.0한의 답변은" "입니다.

git rm path-to-submodule

단, 서브모듈이 소스 제어에서 삭제되어도 .git/modules/path-to-submodule에는 서브모듈 저장소가 포함되어 있고 .git/config에는 해당 URL이 포함되어 있으므로 수동으로 삭제해야 합니다.

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

가끔 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,-f 삭제:

$ git rm -f img2vec

예를 들어 다음과 같은 오류가 발생할 수 있습니다.

$ git rm img2vec/
error: the following file has changes staged in the index:
    img2vec
(use --cached to keep the file, or -f to force removal)

는 존을 한 더 .cd하여 Git합니다.

cd submodule
rm -fr .git

그러면 하위 모듈에 대한 오래된 참조 없이 상위 Git 저장소의 일부로 파일을 커밋할 수 있습니다.

git v2.7.4에서는 심플한 3단계가 정상적으로 동작했습니다.

git submodule deinit -f -- a/submodule    
git rm -f a/submodule
git commit

다음은 필요하거나 유용한 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 질문의 두 번째 부분은 언젠가 긍정적으로 대답할 수 있기를 바랍니다(1개의 명령으로 할 수 있음).

그러나 2017년 7월 현재 2단계에서 데이터를 삭제해야 합니다..git/modules/그렇지 않으면 나중에 하위 모듈을 다시 추가할 수 없습니다.

git 1.8.5+는 tinlyx의 답변과 같이 위의 두 단계를 거치지 않아도 될 것입니다.git submodule을 사용법

에서는 3단계에서 '3단계'를해 줍니다.the_submodule " " " "".git/config(이 엔트리로 인해 오래된 git 버전에서는 문제가 발생할 수 있지만 테스트할 것은 없습니다).

대부분의 에서는 '아까보다'를 사용하는 것이 .git submodule deinit사용법이 더 명확하고 혼란스럽지 않습니다.git config -f .git/config --remove-sectiongit-submodule 문서에 따르면git deinit:

지정된 서브모듈 등록 취소...저장소에서 서브모듈을 삭제하고 대신 git-rm[1]을 사용하는 것을 커밋하는 경우.

입니다.git commit 하면가 날 git submodule summary2.의 경우 (git 2.7의 경우:

fatal: Not a git repository: 'the_submodule/.git'
* the_submodule 73f0d1d...0000000:

이것은 스텝 2 또는 3 중 어느 쪽을 실행하든 상관없습니다.

git에서 서브모듈을 삭제하는 가장 좋은 방법은 다음과 같습니다.

$ git submodule deinit -f <submodule-name>
$ rm -rf .git/modules/<submodule-name>
$ git config -f .gitmodules --remove-section submodule.<submodule-name>
$ git config -f .git/config --remove-section submodule.<submodule-name>
$ git rm --cached <submodule-name>
$ git commit -m 'rm submodule: <submodule-name>'

방금 .submodule (정확한 이름을 잊어버린) 숨김 파일을 찾았습니다.목록이...그런 식으로 개별적으로 지울 수 있습니다.방금 하나 있어서 삭제했어요.간단하지만 서브모듈에 뭐가 붙어있는지 모르기 때문에 Git을 망칠 수 있습니다.libetpan의 일반적인 업그레이드 문제를 제외하면 아직까지는 괜찮은 것 같습니다만, (바람직하게) 관련이 없습니다.

수동 삭제를 게시한 사람이 아무도 없다는 것을 알고 추가했습니다.

Git 2.17 이상에서는 다음과 같습니다.

git submodule deinit -f {module_name}
git add {module_name}
git commit
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 stash폴더를 삭제합니다.이는 서브모듈 추가가 최근 repo에서 수행한 유일한 작업이라고 가정합니다.

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

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

.gitmodules 변경 추적

git add .gitmodules

슈퍼프로젝트 커밋

git commit -m "Remove submodule submodule_name"

추적되지 않은 하위 모듈 파일 삭제

rm -rf $path_to_submodule

rm -rf .git/modules/$path_to_submodule

참고 항목: 대체 가이드라인

이건 나한테 효과가 있었어.위의 답변은 단말기에서 이 내용을 표시하고 있었으며, 그 외에는 아무 일도 일어나지 않았습니다.

'fatal: not removing 'demolibapp' recursively without -r'
  1. demilibapp은 삭제할 서브모듈 이름입니다.
  2. git 서브모듈 deinit delimibapp
  3. git rm --syslog demilibapp -r
  4. rm - syslogs . syslogs / syslogs / syslogibapp
  5. git add --모두
  6. git - m "commit extra submodules"
  7. git push
  8. rm -420 demlibapp

로컬 파일시스템에서 폴더를 삭제하지 않고 서브모듈을 삭제할 경우 다음 작업을 수행할 수 있습니다.

MOD=example
git rm --cached -f apps/$MOD
git config -f .gitmodules --remove-section submodule.$MOD

언급URL : https://stackoverflow.com/questions/1260748/how-do-i-remove-a-submodule

반응형