2011-02-26 7 views
50

최근에 도트 파일을 ~/Dropbox/dotfiles에있는 Git 저장소에 살도록 재구성했습니다. 병원균을 사용하여 모든 Vim 애드온을 ~/Dropbox/dotfiles/home/.vim/bundle 번들로 묶어 사용하고 있습니다. 이 Addons는 Git 서브 모듈로 추가되었습니다..gitignore 파일을 자식 서브 모듈에 추가했습니다.

이제는 Vim을 실행할 때 자동으로 모든 애드온에 대한 설명서를 생성하여 각 하위 모듈 디렉토리에 넣습니다. 이렇게하면 추적 할 수없는 콘텐츠가 하위 모듈에 추가되므로 피하고 싶습니다.

[email protected] ~/Dropbox/dotfiles ‹master*› $ git st 
# On branch master 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# (commit or discard the untracked or modified content in submodules) 
# 
# modified: home/.vim/bundle/fuzzyfinder (untracked content) 
# modified: home/.vim/bundle/l9 (untracked content) 
# modified: home/.vim/bundle/matchit (untracked content) 
# modified: home/.vim/bundle/ruby (untracked content) 
# ... 
no changes added to commit (use "git add" and/or "git commit -a") 

내가 서브 모듈 내부의 모든 doc 폴더를 무시하는 내 Git 저장소의 루트에 .gitignore 파일을 추가했지만,이 작동하지 않습니다

home/.vim/bundle/**/doc 

내 질문 :이 Git 하위 모듈 내의 파일과 폴더를 무시하거나 Git 저장소 외부의 폴더에 문서를 만들도록 Vim을 구성하는 방법?

편집 : 랜디 모리스는 지적이 당신은 당신의 서브 모듈의 각 내에서 .gitignore을 추가해야 Generating tags to different location by pathogen

+0

가능한 중복 : http://stackoverflow.com/questions/4343544/generating-tags-to-different- location-by-pathogen # 4346300 –

+0

네 말이 맞아. 질문에 플래그를 지정하려고합니다. 감사! – rubiii

+1

참고 :'.gitignore'에서'**'는 "어느 깊이"라도 의미하지 않습니다. –

답변

64

의 중복 될 수 있습니다.
서브 모듈은 중첩 된 Git 저장소와 같으므로 자체 무시 규칙을 처리하며 상태는 부모 저장소의 .gitignore (예 : explained here)의 영향을받지 않습니다.

vim 관련 설정의 경우 Randy Morris은 댓글에 언급되어 있으므로 "Generating tags to different location by pathogen"질문을 참조하십시오.


참고 : Nick이 의견에 언급하고, "Generating tags to different location by pathogen"는 설정 등을 답으로 예시 된 바와 같이 같이

[submodule "path/to/submodule"] 
    path = path/to/submodule 
    url = http://github.com/username/repo.git 
    ignore = untracked # <==== 

이 작동하고 git status에 의해 무시하는 서브 모듈을 만들 것입니다.
"ignore = untracked"means at least Git1.7.2.


참고 : in the comments을 언급 nurettin :

ignore = dirty

Commit aee9c7d 위해 그것을했다가 untrackeddirty의 차이를 자세히 설명합니다.

  • "dirty"다음 커밋 superproject에 기록 HEAD이 수정 간주됩니다 서브 모듈은, 서브 모듈의 작업 트리 모든 변경를 무시됩니다 만 차이.
    이 값을 사용하면 서브 모듈에서 작업 트리가 전혀 변경되지 않기 때문에 큰 서브 모듈에서 성능상의 이점을 얻을 수 있습니다."untracked는"

  • : 서브 모듈에서만 비 추적 파일이 나무 작업은 수정로 표시됩니다 서브 모듈의 파일을 HEAD을 변경 및/또는 수정, 무시됩니다.

+0

나는 다른 사람들의 힘내 저장소를 수정하는 것을 좋아하지 않지만,'ignore = untracked' 옵션은 잘 작동한다. 고마워요! – rubiii

+1

ignore = untracked 설정이 작동하려면 최소한 git 버전 1.7.2가 필요합니다. 여기에 의견을 참조하십시오 : http://stackoverflow.com/questions/4343544/generating-tags-to-different-location-by-pathogen/4346300#4346300 –

+1

@ 닉 : 좋은 지적. 나는 대답에 그것을 포함시켰다. – VonC

-2

여기서 기본적인 문제는 '추적 된'변경 사항을 무시하려고한다는 것입니다. .gitignore은 repo에 대한 '추적되지 않은'변경 사항 만 무시합니다. 레포 (추적)의 일부 파일을 수정하고 .gitignore 파일에 추가 할 수 있는지 확인합니다. git status에서 파일이 여전히 '수정 됨'으로 표시된다는 것을 알 수 있습니다. 하위 모듈 저장소는 기본 저장소에서 추적하는 것으로 간주되므로 상위 저장소에 gitignore를 추가하면 작동하지 않습니다. 다른 곳에서 제안한대로 .gitignore 개의 개별 repo를 추가하거나 최근의 자식 버전을 사용하는 경우 git status --ignore-submodules을 사용할 수 있습니다.

+1

nope. 그 파일은 새롭고 'untracked'입니다. 미안하지만 문제 해결에 도움이되지는 않습니다. – rubiii

8

VonC의 ignore = untracked 작품의 추천,하지만 당신은 그러한 모든 서브 모듈의 변경을해야합니다.

문제를 한 번에 모두 해결하려면 모든 자식 repo에서 글로벌 gitignore 패턴을 git config --global core.excludesfile ~/.gitignore_global으로 구성한 다음 doc/tags을 $ HOME/.gitignore_global에 추가하면됩니다.

https://help.github.com/articles/ignoring-files을 참조하십시오.

1

벤의 대답은 좋은 출발입니다. 그러나 이러한 특정 무시 규칙에 대해서는 글로벌 환경이 마음에 들지 않습니다.

각 서브 모듈의 로컬 설정을 선호하고, 중앙은 서브 모듈 루트 저장소에 파일을 무시 :

cd .vim/bundle 
echo "doc/tags" > .gitignore_submodules 
git submodule foreach git config --local core.excludesfile "../.gitignore_submodules" 
관련 문제