추적되지 않은 콘텐츠를 추적하는 방법? 수 있도록 서브 모듈을 작동 시키

원래 질문에 대해서는 아래 실선을 참조하십시오.

로컬 디렉토리에 추적되지 않은 폴더가 있습니다. 내가 실행하면 git status, 내가 얻을 :

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

입력 git add vendor/plugins/open_flash_chart_2한 후 git status다시 시도해 도 여전히 추적되지 않습니다. 무슨 일이야?


다음은 최근 30 분의 간단한 요약입니다.

  • 내 Github 저장소가 내 vendor/plugins/open_flash_chart_2플러그인을 추적하지 않는 것을 발견했습니다 . 특히 내용이 없으며 폴더 아이콘에 녹색 화살표 가 표시 됩니다.

  • 시도 git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • 시도 git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • .gitmodules내 저장소 / 로컬 디렉토리에 이름이 지정된 파일을 찾았지만 찾을 수 없습니다.

git이 제대로 추적을 시작할 수 있도록 서브 모듈을 작동 시키 려면 어떻게해야 합니까?


이것은 관련이 없을 수 있지만 (도움이되는 경우 포함) git commit -a평소보다 입력 할 때마다 git commit -m "my comments"오류가 발생합니다.

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

나는 Github의 완전한 초보자이며 설명서를 보려고 노력했지만 이러한 특정 문제에 약간 혼란스러워합니다. 감사합니다.



답변

vendor/plugins/open_flash_chart_2“gitlink”항목으로 추가 했지만 하위 모듈로 정의하지 않았습니다. 효과적으로 git 서브 모듈 이 사용하는 내부 기능 (gitlink items)을 사용하고 있지만 서브 모듈 기능 자체를 사용하고 있지 않습니다.

아마도 이런 식으로했을 것입니다 :

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

이 마지막 명령이 문제입니다. 디렉토리 vendor/plugins/open_flash_chart_2는 독립적 인 Git 저장소로 시작합니다. 일반적으로 이러한 하위 리포지토리는 무시되지만 git add 에 명시 적으로 추가하도록 지시하면 디렉토리의 내용을 추가하는 대신 하위 리포지토리의 HEAD 커밋을 가리키는 gitlink 항목이 생성됩니다. git add 가 그러한“반-서브 모듈”생성을 거부 한다면 좋을 것입니다.

일반 디렉토리는 Git에서 트리 객체로 표시됩니다. 트리 객체는 이름과 객체에 포함 된 객체 (보통 다른 트리 및 BLOB 객체 — 디렉토리 및 파일)에 대한 권한을 부여합니다. 서브 모듈은 “gitlink”엔트리로 표시됩니다. gitlink 항목은 서브 모듈의 HEAD 커밋의 객체 이름 (해시) 만 포함합니다. gitlink의 커밋에 대한“소스 저장소”는 .gitmodules파일 (및 .git/config서브 모듈이 초기화되면 파일)에 지정됩니다.

현재 커밋에 대한 소스 리포지토리를 기록하지 않고 특정 커밋을 가리키는 항목이 있습니다. gitlink를 적절한 서브 모듈로 만들거나 gitlink를 제거하고“일반”컨텐츠 (일반 파일 및 디렉토리)로 바꾸면이 문제를 해결할 수 있습니다.

적절한 하위 모듈로 전환

vendor/plugins/open_flash_chart_2하위 모듈 로 올바르게 정의하기 위해 누락 된 유일한 비트 는 .gitmodules파일입니다. 일반적으로 (맨손으로 gitlink 항목으로 추가하지 않은 경우) 다음을 사용합니다 git submodule add.

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

알다시피, 경로가 이미 색인에 존재하면 작동하지 않습니다. 해결책은 인덱스에서 gitlink 항목을 임시로 제거한 다음 서브 모듈을 추가하는 것입니다.

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

기존 하위 리포지토리를 사용하고 (즉, 소스 리포지토리를 다시 복제하지 않음) .gitmodules다음과 같은 파일을 준비합니다.

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

또한 메인 리포지토리에서 설정 .git/config없이 유사한 항목을 만듭니다 path.

커밋하면 적절한 하위 모듈이 생깁니다. 리포지토리를 복제 할 때 (또는 GitHub로 푸시하고 거기서 복제 할 때)를 통해 하위 모듈을 다시 초기화 할 수 있어야합니다 git submodule update --init.

일반 내용으로 교체

다음 단계에서는 하위 리포지토리에 vendor/plugins/open_flash_chart_2보존하려는 로컬 히스토리가 없다고 가정합니다 (즉, 관심있는 모든 것은 리포지토리가 아닌 하위 리포지토리의 현재 작업 트리 임).

관심있는 하위 리포지토리에 로컬 기록이있는 경우 .git아래 두 번째 명령에서 하위 리포지토리의 디렉토리를 삭제하기 전에 백업해야 합니다. ( 하위 저장소의 HEAD 히스토리를 보존하는 아래 의 git 서브 트리 예제를 고려하십시오 ).

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

이번에는 디렉토리를 추가 할 때 하위 리포지토리가 아니므로 파일이 정상적으로 추가됩니다. 불행히도 .git디렉토리를 삭제했기 때문에 소스 리포지토리를 최신 상태로 유지할 수있는 가장 쉬운 방법은 없습니다.

대신 하위 트리 병합 사용을 고려할 수 있습니다 . 그렇게하면 소스 리포지토리에서 변경 사항을 쉽게 가져 오면서 리포지토리의 파일을 “플랫”으로 유지할 수 있습니다 (서브 모듈 없음). 타사 git subtree 명령 은 하위 트리 병합 기능을 둘러싼 훌륭한 래퍼입니다.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

나중:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request

git subtree--squash소스 리포지토리의 히스토리를 히스토리에 포함시키지 않아도 업스트림 변경을 가져올 수 있는 옵션도 있습니다.


답변

방금 같은 문제가있었습니다. 그 이유는 “.git”폴더가 포함 된 하위 폴더가 있기 때문입니다. 그것을 제거하면 자식이 행복해졌습니다.


답변

  1. 새 디렉토리에서 .git 디렉토리를 제거했습니다 (이것은 하위 모듈 드라마를 만들 수 있습니다. 관심이 있다면 Google에 추가하십시오).
  2. 그런 다음 git rm -rf –cached / the / new / directories를 실행했습니다.
  3. 그런 다음 git add로 디렉토리를 다시 추가했습니다. 위에서

참조 URL https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U


답변

Chris Johansen의 OP와의 채팅에서 발굴해야 할 것을 지적하려면 (답변에서 답변으로 연결됨) :

git add vendor/plugins/open_flash_chart_2 # gitlink를 추가하고, 내용은 추적되지 않습니다.

git add vendor/plugins/open_flash_chart_2/ # 슬래쉬에주의하십시오 !!!!

두 번째 양식은 gitlink없이 추가하고 내용을 추적 할 수 있습니다. .git 디렉토리는 편리하고 자동으로 무시됩니다. 고마워 크리스!


답변

Peter Lada가 항상 제안한 트릭을 “가짜 서브 모듈”이라고합니다.

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

여러 시나리오에서 매우 유용합니다 (elpa / el-get 패키지 디렉토리에있는 모든 git 저장소의 현재 HEAD를 포함하여 모든 Emacs 구성을 저장소에 유지하는 데 사용하므로 알려진 롤로 쉽게 롤백 / 포워드 할 수 있습니다) 일부 업데이트가 무언가를 깨뜨릴 때 작동하는 버전).


답변

http://progit.org/book/ch6-6.html

서브 모듈에 대해 조금 배우려면 이것을 읽어야한다고 생각합니다. 잘 작성되어 있으며 읽는 데 많은 시간이 걸리지 않습니다.


답변

많은 서브 모듈이있는 큰 프로젝트에서 같은 문제가있었습니다. 의 답변을 바탕으로 크리스 욘센 여기VonC 여기에서 나는 기존의 모든 gitlink 항목을 반복하고 적절한 서브 모듈로 추가 짧은 bash는 스크립트를 구축 할 수 있습니다.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

이 문제가 해결되었으므로 도움이 되길 바랍니다.