추적되지 않은 콘텐츠를 추적하는 방법?


159

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

로컬 디렉토리에 추적되지 않은 폴더가 있습니다. 내가 실행하면 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의 완전한 초보자이며 설명서를 보려고 노력했지만 이러한 특정 문제에 약간 혼란스러워합니다. 감사합니다.


2
몇 가지에 대해 혼란스러워합니다. 하나 : 왜 github을 계속 말합니까? 당신이 말하는 모든 것은 현지 소리입니다 (녹색 화살표 제외-나는 그것에 대해 아무것도 모른다). 맞습니까? 아니면 업데이트를 github에 푸시하는 것에 관한 질문입니까? 둘째 :이 플러그인을 하위 모듈로 만들기 위해 실제로 무엇을 했습니까? 하위 모듈은 자체적으로 git 저장소입니다. 별도로 생성 한 다음 수퍼 프로젝트에 추가하십시오.
Cascabel

1
git 상태의 결과는 실제로 서브 모듈이 있음을 나타냅니다 ...하지만 실제로 .gitmodules 파일이 없습니까? 이 플러그인은 자신의 repo을 가지고, 당신은 당신이 원하는 그것의 버전을 알고 있다면 솔직히, 당신은, 당신의 프로젝트에서 해당 디렉토리를 제거하십시오 .gitmodules에 항목이 없습니다 확인하고 서브 모듈 설치 프로그램을 통해 갈 수있다 : git submodule add, git submodule update --init.
Cascabel

Jefromi-실제로 Github을 두 번 이상 언급하지 않았습니다. 처음으로 open_flash_chart_2의 실제 Github 리포지토리에있는 노란색 폴더 이미지 위에 녹색 화살표가 표시되기 때문입니다. 답을 더 명확하게하기 위해 행복하게 답변을 편집하겠습니다.
sscirrus

1
@ sscirrus : 당신은 분명히 환경 설정, 서브 모듈이 있어야합니다. 이것이 외부 작업이지만 업데이트를 원할 경우 하위 모듈이어야합니다. 원래 리포지토리에서 업데이트를 얻는 데 신경 쓰지 않고 소스를 직접 해킹하려는 경우 하위 모듈이 아니어야합니다.
Cascabel

1
이 질문은 순전히 자식 서브 모듈에 관한 것 같습니다. 이 질문은 레일이나 github과 직접 관련이 없기 때문에 일부 태그를 제거했습니다 . 모든 git 사용 사례에 적용됩니다 . 그리고 tracking그 중 하나를 적용하지 않을 수 있도록 태그는 '웹 사이트 방문자 추적'항목에 사용되는 것 같다.
edgerunner

답변:


239

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소스 리포지토리의 히스토리를 히스토리에 포함시키지 않아도 업스트림 변경을 가져올 수 있는 옵션도 있습니다.


크리스, 방금 시도했는데 rm -rf vendor/plugins/open_flash_chart_2/.git'rm'이 인식되지 않습니다. 그 때 나는 노력 git rm -rf vendor/plugins/open_flash_chart_2/.git과는 말했다 fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(하지만 난 Windows 탐색기에서이 얻을 수 있습니다!).
sscirrus

2
우리는 조금 문제 논의 채팅에서 국지적 인 영업 이익은 하위 저장소의 제거 할 수 있었다 .git(최초의 "일반 내용"옵션) "단호하게"파일을 다시 추가 DIR하고 있습니다.
Chris Johnsen

1
이것은 다른 날에 내 엉덩이를 너무 많이 구했습니다. 실수로 git 디렉토리가있는 git repo에 무언가를 추가 한 다음 git kinda-sorta는 하위 모듈이 있다고 생각하여 내 git svn dcommits가 괴물이되었다고 생각했습니다. 내가 할 수 있다면 난 당신을 세 번 공언합니다.
davidtbernal

타사 플러그인 subtree을 하위 트리 병합과 혼동하지 마십시오. 포장지가 아닙니다. 작성자 : P
NebulaFox

@NebulaFox는 :하지만 자식 하위 트리가 아닌 단지 (즉, 하위 트리 병합 래퍼, 그것은 확실히 표준 "서브 트리 병합"절차와 동일한 기술을 사용하지 git readtree --prefix=path: 및 하위 트리 병합 git merge-s subtree-Xsubtree=path ). --squash모드, split명령, pushpull도우미 와 같은 멋진 추가 기능도 있습니다.
크리스 존슨

114

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


예, AndroidStudio에서 이런 일이 발생했습니다. git repo가 ​​하나의 폴더를 만들려고 시도하는 동안 git repo가 ​​이미 / app 폴더에 작성되었습니다. 감사.
ZirconCode

나는 많은 다른 폴더 아래에 각도 cli 생성 된 앱을 가지고 있었고 하나의 폴더에는 .git 폴더가 있습니다 : / 그것은 하위 모듈이 아닌 실제 문제입니다!
Pascal

이것은 나를 위해 작동합니다 ... git add를 여러 번 시도했지만 아무 일도 일어나지 않았습니다. 그런 다음 .git폴더를 제거 합니다
Ninja

1
그러나 여전히 하위 폴더를 추적하려면 어떻게해야합니까? 어떻게해야합니까?
cyber8200

같은 경우가 있습니다. 슬프게도 .git 폴더가 들어있는 하위 폴더를 추적하고 싶습니다. 이 sufolder .git 폴더를 삭제 한 후에는 더 이상 기본 .git 폴더에서 추적되지 않습니다 .... :(
sqp_125


6

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

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

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

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


5

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

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

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


3

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

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


3

많은 서브 모듈이있는 큰 프로젝트에서 같은 문제가있었습니다. 의 답변을 바탕으로 크리스 욘센 여기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"

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


2

이것은 나를 위해 잘 작동했습니다.

자식 업데이트 색인 --skip-worktree

경로 이름으로 작동하지 않으면 파일 이름을 사용하십시오. 이것이 당신에게도 효과가 있는지 알려주세요.

안녕!


1

같은 문제가 있었지만이 토론에서는 해결되지 않았습니다.

스레드 오프닝에 설명 된대로 하위 모듈 문제도 발생했습니다.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

diff를 보면서 해시에 추가 된 -dirty를 인식했습니다. 문서를 다시 읽으면 문제가 해결되었습니다. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html "서브 모듈이있는 함정"섹션을보십시오

이유는 서브 모듈 내에서 변경되거나 추적되지 않은 컨텐츠가 있었기 때문입니다. 먼저 서브 모듈 디렉토리로 가서 "git add"+ "git commit"을 수행하여 서브 모듈 내에서 모든 내용을 추적했습니다.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

이제 서브 모듈의 새로운 HEAD를 마스터 모듈에 커밋 할 수 있습니다.


1

나는 최근에 계약 프로젝트 (분류 된 것으로 간주)에서 작업하는 동안이 문제가 발생했습니다. 코드를 실행해야하는 시스템은 물론 보안 목적으로 인터넷에 액세스 할 수 없었으므로 작곡가와 npm을 사용하여 종속성을 설치하는 것은 큰 고통이되었습니다.

동료와 많은 심의를 마친 후 작곡가 설치 또는 npm 설치 대신 의존성을 복사하여 붙여 넣기로 결정했습니다.

이로 인해 우리는 gitignore에 벤더와 npm_module을 추가하지 않았습니다. 이 문제가 발생했을 때입니다.

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

나는 이것을 조금 봤고 SO 에서이 유용한 스레드를 발견했다. Git에서 너무 많은 전문가가 아니고 작업하면서 약간의 중독에 빠지면서 벤더 폴더의 모든 하위 모듈을 검색했습니다.

find . -name ".git"

이것은 나에게 4-5 의존성을 주었다. 이 모든 .git 폴더와 voila를 제거했습니다. 나는 그것이 해킹임을 알고 어쨌든별로 괴짜가 아닙니다. 오 신 들아, 제발 용서해주세요! 다음에 나는 gitlink를 읽고 강력한 Linus Tovalds에 순종하겠다고 약속했다.


1

이 질문은 이미 답변되었지만이 메시지를 받았을 때 발견 한 내용을 믹스에 추가한다고 생각했습니다.

playground여러 샌드 박스 앱이 포함 된 리포지토리 가 있습니다. playground튜토리얼의 저장소를 복제하여 튜토리얼에서 디렉토리에 두 개의 새로운 앱을 추가했습니다 . 결과적으로 새로운 앱의 자식 항목은 내 레포가 아닌 튜토리얼의 레포를 가리 켰습니다. 해결책은 .git각 앱 디렉토리에서 디렉토리 를 삭제하고 디렉토리 mv외부의 앱 디렉토리 를 삭제 playground한 다음 mv다시 실행하는 것 git add .입니다. 그 후 그것은 효과가있었습니다.


1

하위 폴더에서 .git 파일을 삭제 하여이 문제를 해결했습니다.

  1. 먼저 하위 폴더에서 .git 파일을 삭제하십시오.
  2. 그런 다음 git rm -rf --cached your_subfolder_name 코드를 실행하여 git에서 하위 폴더를 제거하십시오.
  3. 그런 다음 git add로 폴더를 다시 추가하십시오 . 명령

0

먼저 디렉토리 로 이동하십시오 : vendor / plugins / open_flash_chart_2DELETE


그때 :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

산출

지점 마스터에서
지점은 '원산지 / 마스터'로 최신 상태입니다.
커밋 할 것이없고 작업 디렉토리 정리

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.