UFO ET IT

Git 저장소 내에서 기존 Git 하위 모듈을 이동하려면 어떻게 해야 합니까?

ufoet 2023. 5. 13. 20:27
반응형

Git 저장소 내에서 기존 Git 하위 모듈을 이동하려면 어떻게 해야 합니까?

제 Git 슈퍼 프로젝트에서 Git 서브모듈의 디렉토리 이름을 변경하고 싶습니다.

의 가다같항가목있지다가보다니겠습정해고고내을은음과▁my▁in▁entry다▁the▁following.gitmodules파일 이름:

[submodule ".emacs.d/vimpulse"]  
path = .emacs.d/vimpulse  
url = git://gitorious.org/vimpulse/vimpulse.git

이동하려면 무엇을 입력해야 합니까?.emacs.d/vimpulse에서 디리토렉으로 이동합니다..emacs.d/vendor/vimpulse먼저 삭제하지 않고(여기여기에 표시됨) 다시 시작합니다.

Git는 정말로 서브모듈 태그의 전체 경로가 필요합니까?

[submodule ".emacs.d/vimpulse"]

또는 하위 프로젝트의 이름만 저장할 수 있습니까?

[submodule "vimpulse"]

최신 버전의 git

Git는 이제 하위 모듈 이동을 기본적으로 지원합니다.

1 이후 git 1.8.5 µm,git mv old/submod new/submod예상대로 작동하고 모든 배관을 해줍니다.하위 모듈 이동에 대한 수정 사항이 포함되어 있으므로 git 1.9.3 이상을 사용하는 것이 좋습니다.

이전 버전의 git

댓글에 언급된 것처럼 이 답변은 이전 버전의 git에 필요한 단계를 나타냅니다.

이 프로세스는 하위 모듈을 제거하는 방법과 유사합니다(하위 모듈 제거 방법 참조).

  1. .gitmodules서브모듈의 경로를 적절히 변경하여 인덱스에 넣습니다.git add .gitmodules.

  2. 경우 합니다.mkdir -p new/parent).

  3. 에서 새 합니다.mv -vi old/parent/submodule new/parent/submodule).

  4. Git가 이 디렉터리를 추적하는지 확인합니다.git add new/parent).

  5. 를제다니거합으로 이전 합니다.git rm --cached old/parent/submodule.

  6. .git/modules/old/parent/submodule할 수 있는 모든 것을 가지고.git/modules/new/parent/submodule.

  7. 을 합니다..git/modules/new/parent/config파일, 작업 트리 항목이 새 위치를 가리키는지 확인하십시오. 따라서 이 예제에서는worktree = ../../../../../new/parent/module으로 두 의 반적으두개합있니가 더 ...그 장소의 직접 경로에 있는 디렉토리보다.

  8. 을 편집합니다.new/parent/module/.git가 메인 의 정확한 하십시오..git이에서는 폴더, 이예서는에제.gitdir: ../../../.git/modules/new/parent/submodule.

    git status출력은 나중에 다음과 같이 나타납니다.

     # On branch master
     # Changes to be committed:
     #   (use "git reset HEAD <file>..." to unstage)
     #
     #       modified:   .gitmodules
     #       renamed:    old/parent/submodule -> new/parent/submodule
     #
    
  9. 마지막으로 변경 사항을 커밋합니다.

가장 현대적인 대답은 위의 발로릭의 논평에서 따온 것입니다.

  1. Git 1.9.3으로 업그레이드(또는 하위 모듈에 중첩된 하위 모듈이 있는 경우 2.18)
  2. git mv old/submod new/submod
  3. 커밋을 됩니다(" .git " " 를 사용하여 할 수 .git status.)
  4. 로 변경 .git commit그리고 당신은 가도 좋습니다!

알았어!

저의 경우, 저는 하위 모듈을 하나의 디렉토리에서 하위 디렉토리로 옮기고 싶었습니다. 예를 들어, "AFNetworking" -> "ext/A"F네트워킹".다음은 제가 수행한 단계는 다음과 같습니다.

  1. .git 모듈을 편집하여 하위 모듈 이름 및 경로를 "ext/A"로 변경합니다.F네트워킹"
  2. 하위 모듈의 git 디렉토리를 ".git/modules/A"에서 이동합니다.FNetworking"에서 ".git/modules/ext/A"로 이동합니다.F네트워킹"
  3. 라이브러리를 "AF 네트워킹"에서 "ext/A"로 이동F네트워킹"
  4. .git/modules/ext/A"를 합니다.를 지정하고 FNetworking/config"를 합니다.[core] worktree 인라에서 로 바꼈어요. 나의 것이 바뀌었습니다.../../../AFNetworking../../../../ext/AFNetworking
  5. "ext/A" 및 FNetworking/.git" 및정gitdir내 것이 변경됨../.git/modules/AFNetworking../../git/modules/ext/AFNetworking
  6. git add .gitmodules
  7. git rm --cached AFNetworking
  8. git submodule add -f <url> ext/AFNetworking

마지막으로 Git 상태를 확인했습니다.

matt$ git status
# On branch ios-master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   .gitmodules
#   renamed:    AFNetworking -> ext/AFNetworking

에트빌라위의 예제는 디렉터리 깊이를 변경하지 않으며, 이는 작업의 복잡성에 큰 차이를 주며, 하위 모듈의 이름을 변경하지 않습니다(실제로 필요하지는 않지만 해당 경로에 새 모듈을 추가할 경우 발생하는 것과 일치하도록 했습니다).

[Update: 2014-11-26] Yar가 아래에 잘 요약했듯이, 당신이 무엇을 하기 전에, 당신이 서브모듈의 URL을 알고 있는지 확인하세요.알 수 없는 경우 키를submodule.<name>.url 열고 검사합니다.

제게 효과가 있었던 것은 다음을 사용하여 이전 서브모듈을 제거한 것입니다.git submodule deinit <submodule>에 뒤에git rm <submodule-folder>그런 다음 새 폴더 이름으로 하위 모듈을 다시 추가하고 커밋합니다.커밋하기 전에 git 상태를 확인하면 이전 하위 모듈의 이름이 새 이름으로 변경되고 .git 모듈이 수정된 것으로 표시됩니다.

$ git submodule deinit foo
$ git rm foo
$ git submodule add https://bar.com/foo.git new-foo
$ git status
renamed:    foo -> new-foo
modified:   .gitmodules
$ git commit -am "rename foo submodule to new-foo"

속임수는 이해하는 것처럼 보입니다..git의 서브듈디마리아보리다관니됩래에토지포이제터 아래에 됩니다..git/modules 각 에는 그고각서듈은모가 ..git그것을 가리키는 파일.지금 필요한 절차는 다음과 같습니다.

  • 서브모듈을 새 홈으로 이동합니다.
  • 을 합니다..git directory에 파일을 한 후 repository의 합니다..git/modules디렉토리입니다.
  • 마스터 리포지토리의 주소를 입력합니다..git/modules디렉터리를 찾은 다음 하위 모듈에 해당하는 디렉터리를 찾습니다.
  • 을 합니다.config, 파일 이름worktree하위 모듈의 작업 디렉터리의 새 위치를 가리키는 경로입니다.
  • 을 합니다..gitmodules마스터 리포지토리의 루트에 있는 파일로, 하위 모듈의 작업 디렉터리 경로를 업데이트합니다.
  • git add -u
  • git add <parent-of-new-submodule-directory>하위 모듈 디렉토리가 아니라 상위 모듈을 추가하는 것이 중요합니다.

몇 가지 참고 사항:

  • [submodule "submodule-name"].gitmodules그리고..git/config서로 일치해야 하지만 다른 것에 해당하지 않습니다.
  • 및 "작업 디렉토리".git디렉터리가 서로를 올바르게 가리켜야 합니다.
  • .gitmodules그리고..git/config파일을 동기화해야 합니다.

"[submodule] 뒤에 따옴표로 묶은 문자열은 중요하지 않습니다.원한다면 "foobar"로 변경할 수 있습니다.".git/config"에서 일치하는 항목을 찾는 데 사용됩니다.

따라서 "git submodule init"을 실행하기 전에 변경하면 정상적으로 작동합니다.변경한 경우(또는 병합을 통해 변경 내용을 선택한 경우) 수동으로 .git/config를 편집하거나 "git submodule init"를 다시 실행해야 합니다.후자를 수행하면 이전 이름이 .git/config에 있는 무해한 "좌초" 항목이 남게 됩니다.

표준 명령을 사용하여 새 하위 모듈을 추가하고 이전 하위 모듈을 제거하기만 하면 됩니다.(.git 내부의 우발적인 오류를 방지해야 함)

설정 예:

mkdir foo; cd foo; git init; 
echo "readme" > README.md; git add README.md; git commit -m "First"
## add submodule
git submodule add git://github.com/jquery/jquery.git
git commit -m "Added jquery"
## </setup example>

'jquery'를 'vendor/jquery/jquery'로 이동 예:

oldPath="jquery"
newPath="vendor/jquery/jquery"
orginUrl=`git config --local --get submodule.${oldPath}.url`

## add new submodule
mkdir -p `dirname "${newPath}"`
git submodule add -- "${orginUrl}" "${newPath}"

## remove old submodule
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 old src
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (housekeeping)

## commit
git add .gitmodules
git commit -m "Renamed ${oldPath} to ${newPath}"

대형 하위 모듈에 대한 보너스 방법:

하위 모듈이 크고 복제본을 기다리지 않으려면 이전을 오리진으로 사용하여 새 하위 모듈을 생성한 다음 오리진을 전환할 수 있습니다.

예제(같은 예제 설정 사용)

oldPath="jquery"
newPath="vendor/jquery/jquery"
baseDir=`pwd`
orginUrl=`git config --local --get submodule.${oldPath}.url`

# add new submodule using old submodule as origin
mkdir -p `dirname "${newPath}"`
git submodule add -- "file://${baseDir}/${oldPath}" "${newPath}"

## change origin back to original
git config -f .gitmodules submodule."${newPath}".url "${orginUrl}"
git submodule sync -- "${newPath}"

## remove old submodule
...

셸 스크립트 git-submodule-move를 사용하면 됩니다.

주어진 해결책은 나에게 효과가 없었지만, 비슷한 버전은 나에게 효과가 있었습니다.

이것은 복제된 저장소를 사용하므로 하위 모듈 git 저장소는 상위 저장소 .gitdir에 포함됩니다.모든 양이온은 상위 리포지토리에서 가져옵니다.

  1. .git 모듈을 편집하고 해당 하위 모듈의 "경로 =" 설정을 변경합니다.(라벨을 변경하거나 이 파일을 색인에 추가할 필요가 없습니다.)

  2. .git/submodule/name/config를 편집하고 문제의 하위 모듈에 대한 "worktree =" 설정을 변경합니다.

  3. 실행:

    mv submodule newpath/submodule
    git add -u
    git add newpath/submodule
    

저의 경우 저장소가 원자성인지 상대적인 서브모듈인지(submodule/.git는 topproject/.git/modules/submodule에 대한 참조) 차이가 있는지 궁금합니다.

저는 어제 이 시련을 겪었고대답은 완벽하게 들어맞았습니다.명확한 설명을 위해 다음 단계를 수행합니다.

  1. 하위 모듈이 체크인되어 서버에 푸시되었는지 확인합니다.또한 어떤 가지에 있는지도 알아야 합니다.
  2. 서브모듈의 URL이 필요합니다!사용하다more .gitmodules 일단 하면 그 모듈은에 없을 입니다.
  3. 이제 사용할 수 있습니다.deinit,rm그리고 나서.submodule add

  • Git 하위 모듈 위치: Classes/lib/must정말로
  • 이동 위치: lib/AudioBus
  • URL: http://developer.audiob.us/download/SDK.git

명령

    git submodule deinit Classes/lib/mustIReally
    git rm foo
    git submodule add http://developer.audiob.us/download/SDK.git lib/AudioBus

    # do your normal commit and push
    git commit -a 

참고: gitmv는 이것을 하지 않습니다.조금도.

▁running위를▁me▁for달을 실행하는 나를 위해.git mv <old/path> <new/path실패:

Rename from 'old/path' to 'new/path' failed. Should I try again? (y/n)

를 한 후git deinit <old/path>사용할 수 있었습니다.git mv.

저는 같은 문제를 만나서 성공적으로 해결합니다.이번 Github 이슈 delete_git_submodule.md에 감사드립니다.

하위 모듈을 제거하려면 다음 작업을 수행해야 합니다.

  • 서관련삭에서 합니다..gitmodulesjava.
  • 을 스테이징합니다. .git 모듈은 변경됩니다.git add .gitmodules
  • 에서 관련 .git/config하지 않을 수 (존재하지 않을 수 있음)
  • 려달을 합니다.git rm --cached path_to_submodule(후행 슬래시 없음).
  • 려달을 합니다.rm -rf .git/modules/path_to_submodule(후행 슬래시 없음).
  • 저다git commit -m "Removed submodule "
  • 파일 rm -rf path_to_submodule

언급URL : https://stackoverflow.com/questions/4604486/how-do-i-move-an-existing-git-submodule-within-a-git-repository

반응형