자식 코드로 공통 코드를 추가 할 때의 문제 :“이미 색인에 존재합니다”


225

나는 자식을 처음 사용하고 서브 모듈을 추가하는 데 도움을 줄 것입니다. 공통 코드를 공유하는 두 개의 프로젝트를 받았습니다. 공유 코드는 방금 두 프로젝트에 복사되었습니다. 공통 코드에 대해 별도의 git repo를 작성하고 git 서브 모듈로 추가 할 계획으로 프로젝트에서 제거했습니다.

git submodule add의 경로 옵션을 사용하여 폴더를 지정했습니다.

git submodule add url_to_repo projectfolder

그러나 오류가 발생했습니다 :

'projectfolder' already exists in the index"

이것은 내 저장소의 원하는 구조입니다.

repo
|-- projectfolder
    |-- folder with common code

git 서브 모듈을 repo 또는 새 폴더에 직접 추가 할 수는 있지만 프로젝트 폴더에는 추가 할 수 없습니다. 문제는 실제로 프로젝트 폴더에 있어야한다는 것입니다. 이것에 대해 무엇을 할 수 있고 git submodule add의 경로 옵션에 대해 무엇을 잘못 이해 했습니까?


당신이하면 무엇을 얻을 수 git ls-files --stage projectfolder있습니까?
Mark Longair

100644로 시작하는 모든 내용의 목록을 얻었습니다.
Vanja


8
git rm기존 폴더에서 작업을 수행하는 데 도움이되었습니다. ||
rogerdpack

답변:


343

내 후속 질문에 답변하지 않았기 때문에 귀하의 질문에 무슨 일이 일어나고 있는지 확신 할 수있는 정보가 충분하지 않을 것입니다. 그러나 이것은 어떤 경우에도 도움이 될 수 있습니다.

이 오류 projectfolder는 이미 준비되어 있음을 의미합니다 ( "인덱스에 이미 있습니다"). 여기서 무슨 일이 일어나고 있는지 확인하려면 해당 폴더 아래의 색인에있는 모든 것을 다음과 같이 나열하십시오.

git ls-files --stage projectfolder

해당 출력의 첫 번째 열은의 색인에 어떤 유형의 객체가 있는지 알려줍니다 projectfolder. (이것은 유닉스 파일 모드처럼 보이지만 git에서는 특별한 의미가 있습니다.)

나는 당신이 다음과 같은 것을 보게 될 것이라고 생각합니다 :

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(즉,로 시작하는 줄 160000)이 경우 저장소 projectfolder는 이미 "gitlink"로 추가되었습니다. 의 출력에 나타나지 않고 git submodule하위 모듈로 다시 추가하려는 경우 다음을 수행 할 수 있습니다.

git rm --cached projectfolder

... 무대를 해제 한 다음 :

git submodule add url_to_repo projectfolder

... 리포지토리를 하위 모듈로 추가합니다.

그러나 많은 블롭이 (파일 모드 100644100755) 와 함께 나열되어 projectfolder새 저장소를 복사하기 전에 파일의 스테이지를 적절하게 해제하지 않았 음을 나타냅니다 . 이 경우 다음을 수행하여 해당 파일을 모두 스테이지 해제 할 수 있습니다.

git rm -r --cached projectfolder

... 그리고 하위 모듈을 다음과 같이 추가하십시오.

git submodule add url_to_repo projectfolder

12
자세한 답변을 위해 Mark에게 감사드립니다. 나는 "git rm -r --cached projectfolder"를하고 서브 모듈을 다시 시도했다. 그러나 이번에는 " 'projectfolder'가 이미 존재하고 유효한 자식 저장소가 아닙니다"라는 오류 메시지가 나타납니다.
Vanja

3
@ Vanja : 디렉토리를 projectfolder포함하지 않았 음을 나타냅니다 .git. 그것은 당신이 projectfolder다른 곳을 위해 새로운 저장소를 생성하고 그것을 제자리에 복사 한 것처럼 귀하의 질문에서 들렸 습니다.하지만 분명히 그렇지 않았습니다. 하위 모듈로 추가하기 전에 projectfolder기존 저장소 를 이동 한 다음 새 저장소 ( .git디렉토리가 포함 된)를 제자리에 복사해야합니다 . 또는로 표시된 리포지토리로 이미 푸시 한 경우 해당 경로에서 벗어나 하위 URL을 추가 url_to_repo할 수 있습니다 projectfolder.
Mark Longair

굉장한 답변 +1

이것은 나에게 큰 도움이되었습니다. 감사합니다!
Evan Moran

1
이것은 내가 한 것입니다 .3 단계 프로세스 1 단계 : git rm -r --cached src / test / resources /, 2 단계 : 기존 리소스 디렉토리를 다른 위치로 제거했습니다 .3 단계 : git submodule add add url_to_repo src / 테스트 / 자원
vikramvi

52

서브 모듈을 수동으로 제거하는 것은 여러 단계로 이루어지며 이것은 나를 위해 일했습니다.

프로젝트 루트 디렉토리에 있고 샘플 git 모듈 이름이 "c3-pro-ios-framework"라고 가정합니다.

서브 모듈과 관련된 파일을 제거하십시오

rm -rf .git/modules/c3-pro-ios-framework/

구성에서 하위 모듈에 대한 참조를 제거하십시오.

vim .git/config

여기에 이미지 설명을 입력하십시오

.gitmodules 제거

rm -rf .gitmodules

"git"없이 캐시에서 제거

git rm --cached c3-pro-ios-framework

하위 모듈 추가

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
좋은 포스트, 잘 작동합니다. 공유 해주셔서 감사합니다. 정말 좋아요
gabn88

1
git submodule제거 후와 추가하기 전에 하위 모듈을 나열하려고 시도했지만 제거를 커밋하면 오류가 발생했습니다.
mehmet

1
가능한 경우이 50 배를 찬성합니다. 당신은 내 하루를 구 했어요!
Sensei James

touch .gitmodules(작업 트리에 있어야하므로 제거하면 도움이되지만 다시 추가해야합니다.) 멋진 포스트 btw. 여기서 일한 것만.
Torxed

그것은 .git여전히 나를 위해 남은 디렉토리 였습니다 . 이것은 훌륭하게 작동했습니다. 감사합니다.
케빈 앤더슨

44

자식 경로에 대한 서브 모듈 자식 저장소 (이 경우 프로젝트 폴더)를 먼저 제거해야합니다.

rm -rf projectfolder

git rm -r projectfolder

그런 다음 하위 모듈을 추가하십시오.

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>동일한 하위 모듈 이름을 유지하기 위해 일했습니다
Tenfrow

1
감사!! 프로젝트 폴더에 추가 할 필요가 없었고 하위 디렉토리로 변경하고 거기에서 복제했습니다.
Tony Fraser

32

나는 같은 문제를 겪었고 몇 시간을 보낸 후에 답을 찾았습니다.

내가 얻는 오류는 약간 달랐습니다 : <path> already exists and is not a valid git repo(그리고 SEO 가치를 위해 여기에 추가되었습니다)

해결책은 서브 모듈을 저장할 디렉토리를 작성하지 않는 것입니다. 디렉토리는 git submodule add명령의 일부로 작성됩니다 .

또한 인수는 작업 디렉토리가 아닌 상위 리포지토리 루트와 관련이 있으므로 예상하십시오.

위의 예에 대한 해결책 :

  1. 부모 리포지토리를 이미 복제 한 것이 좋습니다.
  2. 있는지 확인 common_code디렉토리가 않습니다 하지 존재한다.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( 필요한 슬래시에 유의하십시오. )
  5. 정신력이 회복되었습니다.

다른 곳에서 찾을 정보가 거의 없기 때문에 이것이 누군가에게 도움이되기를 바랍니다.


1
4 단계가 시작되어야 git submodule add하며 후행 슬래시가 필요하지 않습니다.
nullability

오타를 수정했습니다. 나는 그것을 다시 테스트했으며, 후행 슬래시가 나에게 큰 영향을 미쳤다. 효과가 있으면 zsh를 사용하고 있습니다.
정의되지 않은

이것은 내 문제를 해결했습니다 (add submodule commnand로 디렉토리 생성), 감사합니다!
jackJoe

18

xgit control 아래에 이름이 지정된 폴더가있는 경우 동일한 이름의 하위 모듈을 추가 하려면 폴더x삭제 하고 먼저 커밋해야합니다 .

@ ujjwal-singh에 의해 업데이트 :

커밋 할 필요가 없으며 준비가 충분합니다 .. git add/git rm -r


커밋은 내가 놓친 것입니다. 짧은 대답이지만 맞습니다!
Qqwy

3
커밋이 필요하지 않고 준비가 충분합니다. git add/gir rm -r
Ujjwal Singh

3

인간의 언어로 오류가 무엇을 말하려고하는지 명확히하기 위해 :

이 폴더에서 기본 저장소에서 이미 추적 한 저장소를 작성할 수 없습니다.

예를 들어 : AwesomeTheme전용 저장소 라는 테마 폴더가 있고 ,이를 기본 저장소에 직접 덤프하려고 git submodule add sites/themes하면 이것을 얻을 수 "AwesomeTheme" index already exists있습니다.

sites/themes/AwesomeTheme기본 리포지토리의 버전 추적에 하위 모듈 이 없는지 확인해야합니다 .

sites/theme/AwesomeTheme디렉토리 가있는 경우 기본 저장소에서 수정하려면 제거하십시오. sites/theme/AwesomeTheme기본 리포지토리 의 디렉토리를 커밋 한 경우 다음 과 같은 명령으로 디렉토리의 모든 기록을 제거해야합니다.

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

이제 당신은 실행할 수 있습니다 git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

메인 리포지토리는 이전에는 아무것도 발견하지 못 했으므로 (인덱스 화됨) sites/themes/AwesomeTheme이제 만들 수 있습니다.


1

나는 다른 방법으로 그것을 수행하여 그것을 얻었습니다. 빈 저장소로 시작하여 "projectfolder / common_code"라는 새 폴더에 하위 모듈을 추가합니다. 그 후 프로젝트 폴더에 프로젝트 코드를 추가 할 수있었습니다. 자세한 내용은 아래와 같습니다.

빈 저장소 형식으로 :

git submodule add url_to_repo projectfolder/common_code

원하는 폴더 구조가 생성됩니다.

repo
|-- projectfolder
    |-- common_code

이제 더 많은 하위 모듈을 추가 할 수 있으며 프로젝트 코드를 프로젝트 폴더에 추가 할 수 있습니다.

나는 왜 이것이 다른 방식이 아닌이 방법으로 작동했는지 말할 수는 없습니다.


0

IntelliJ 15 내에서 파일을 커밋하려고 할 때도 같은 문제가 있었지만 이것이 유용한 지 모르겠습니다. 결국 SourceTree를 열면 파일을 커밋 할 수있었습니다. 문제 해결됨. 멋진 자식 명령을 실행할 필요가 없습니다. 누군가 같은 문제가있는 경우를 대비하여 언급하십시오.


0

저장소 폴더로 이동하십시오. .gitmodules에서 관련 하위 모듈을 삭제하십시오. 숨김 파일 표시를 선택하십시오. .git 폴더로 이동하여 모듈 폴더 및 구성에서 하위 모듈을 삭제하십시오.


0

대상 경로에 .git 파일이없는 경우 발생합니다. 내가 처형 한 후에 나에게 일어났다 git clean -f -d.

메시지에 표시된 모든 대상 폴더를 삭제 한 다음 실행해야했습니다. git submodule update --remote


-18

git dir에서 모든 변경 사항을 동기화했다고 가정하십시오.

rm -rf .git 

rm -rf .gitmodules

그런 다음 수행하십시오.

git init
git submodule add url_to_repo projectfolder

2
프로젝트의 전체 히스토리가 삭제됩니다!
redbandit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.