내 파일을 무시하는 gitignore 규칙을 설명하십시오.


310

왜 git에 의해 일부 파일이 무시되는지 볼 수있는 방법이 있습니까 (즉, .gitignore파일의 어떤 규칙으로 인해 파일이 무시되는지 )?

수백 개의 폴더와 수십 개의 .gitignore파일 이있는이 (또는 훨씬 더 복잡한 시나리오)가 있다고 상상해보십시오 .

/
-.gitignore
-folder/
    -.gitignore
    -subfolder/
              -.gitignore
              -file.txt

내가 git add folder/subfolder/file.txtgit을 실행하면 무시되고 있다고 불평 할 수 있습니다.

The following paths are ignored by one of your .gitignore files:
folder/subfolder/file.txt
Use -f if you really want to add them.

.gitignore이 파일을 무시하고 규칙을 표시하는 규칙이 가능한 모든 방법을 알 수있는 방법 이 있습니까? 처럼:

The following paths are ignored by your folder/.gitignore file (line 12: *.txt)
folder/subfolder/file.txt
Use -f if you really want to add them.

아니면 그냥 :

$ git why-is-ignored folder/subfolder/file.txt
folder/.gitignore:12:*.txt

4
참고 : git check-ignore곧 (git1.8.5 / 1.9) --no-index옵션이 있습니다. 아래 답변을
VonC

참고 : GIT_TRACE_EXCLUDE=1 git status.gitignore규칙 을 디버깅하는 추가 방법이 될 것 입니다. 아래에서 편집 한 답변
VonC

관련 블로그 게시물 : danielcompton.net/2016/04/21/... .
krlmlr 2016 년

답변:


643
git check-ignore -v filename

자세한 내용 은 매뉴얼 페이지 를 참조하십시오.

원래 답변은 다음과 같습니다.

git은 현재 이와 같은 것을 제공하지 않습니다. 그러나 귀하의 질문을 본 후 인터넷 검색을 수행하여 2009 년 에이 기능이 요청되어 부분적으로 구현 되었음을 알았습니다 . 스레드를 읽은 후 제대로 수행하기에는 너무 많은 작업이 아니라는 것을 깨달았으므로 패치 작업을 시작했으며 다음 날 이틀 안에 완료되기를 희망합니다. 준비가되면이 답변을 업데이트하겠습니다.

업데이트 : 와우, 그것은 내가 예상했던 것보다 훨씬 어려웠습니다. git제외 처리 의 내부 는 매우 비밀입니다. 어쨌든, 오늘날의 업스트림 브랜치에 적용 되는 거의 완성 된 일련의 커밋 이 있습니다 master. 테스트 스위트는 99 % 완료되었지만 --stdin아직 옵션 처리를 완료하지 않았습니다. 이번 주말에 이것을 관리하고 패치를 git 메일 링리스트에 제출하기를 바랍니다.

그동안 git포크 에서 복제 하고 check-ignore지점을 확인한 다음 정상적으로 컴파일하면됩니다.

업데이트 2 : 끝났습니다! 최신 버전은 위의 github에 있으며 피어 리뷰를 위해 패치 시리즈를 git 메일 링리스트 에 제출했습니다. 그들이 어떻게 생각하는지 보자 ...

업데이트 3 : 몇 달 동안 해킹 / 패치 리뷰 / 토론 / 대기 후이 기능이 현재 git 's masterbranch에 도달 했으며 다음 릴리스 (1.8.2, 8 번째 예상)에서 사용할 수 있음을 기쁘게 생각합니다 2013 년 3 월). check-ignore매뉴얼 페이지 는 다음과 같습니다 . 휴, 그건 내가 예상했던 것보다 더 많은 일이었습니다!

업데이트 4 : 이 답변이 어떻게 진화하고 기능이 구현되었는지에 대한 전체 기사에 관심이 있다면 GitMinutes 팟 캐스트 에피소드 32 번을 확인하십시오 .


2
1.8.2를 사용하고 있으며 git check-ignore아무것도하지 않습니다.
zakdances

3
@yourfriendzak 의심의 여지없이 git check-ignore현재 1.8.2에서 작동하고 있습니다. 동작이 예상과 다르면 매뉴얼 페이지를 다시 읽어 보시고 그렇지 않은 경우 git 메일 링리스트에 적절한 버그 보고서를 제출하십시오. 아무 것도하지 않는다고 말하는 것만으로는 큰 도움이되지 않습니다. 나는 당신이 아마이 아닌 무시 파일을 실행하고 (아마에 대한 지원을 추가합니다 있지만 잘못 약간의 출력을 기대하고 기대 --show-unmatched받는 --verbose미래의 출력 모드).
Adam Spiers

1
@AdamSpiers 당신이 맞아요. 명령을 실행할 때 아무것도 인쇄되지 않도록 지정해야합니다. 오류 메시지, 성공 메시지, 정보 없음 다음에 빈 프롬프트가 나타납니다. 따라서 특정 상황에서 "출력 없음"이 예상되는 동작이라고 가정하는 것이 맞습니까?
zakdances

1
@AdamSpiers 감사합니다! 3 일간의 조사 후 .gitignore_global에서 전역 적으로 무시 된 파일로 인해 파괴 빌드의 원인을 추적하는 데 도움이되었습니다! 나는 그것이 일인지 몰랐다!
BenBtg

3
Stack Overflow 개발자가 개발자 기능을 구현하기 위해 많은 변경을하는 것은 일상적인 일이 아닙니다. 와우와 존경.
user3613932

18

자식 2.8 업데이트 (2016 년 3 월) :

GIT_TRACE_EXCLUDE=1 git status

"참조 유효성 검사에 대한 방법 .gitignore파일을 "

이는 git check-ignore -v아래 에 설명 된 내용을 보완 합니다.


원래 답변 : 2013 년 9 월 (git 1.8.2, 1.8.5 이상) :

git check-ignore자식 1.8.5 / 1.9 (2013 년 4 분기) 에서 다시 개선되었습니다 .

" git check-ignore" 는 무시 / 제외 메커니즘이 이미 추적 된 경로에 적용되지 않는다는 점에서 " git add"및 " "와 동일한 규칙을 따릅니다 git status.
" --no-index"옵션을 사용하면 무시해야 할 경로가 실수로 인덱스에 추가 된 것을 진단하는 데 사용할 수 있습니다 .

참조 8231fa6 커밋 에서 https://github.com/flashydave :

check-ignore현재 .gitignore규칙에서 추적되지 않은 경로를 처리 하는 방법을 보여줍니다 . 추적 경로는 유용한 출력을 생성하지 않습니다.
이렇게하면 경로에서 인덱스를 먼저 제거하지 않으면 경로가 예기치 않게 추적 된 이유를 디버깅 할 수 없습니다 git rm --cached <path>.

이 옵션 --no-index은 색인에있는 경로에 대한 검사를 무시하도록 명령에 지시하므로 추적 경로도 검사 할 수 있습니다.

이 동작의 특성에서 벗어나는 동안 git addgit status그 사용 케이스는 사용자의 혼란을 야기 할 가능성이있다.

올바른 동작을 보장하기 위해 표준 무시와 비교하여이 옵션을 확인하기 위해 테스트 스크립트가 기능이 보강되었습니다.


--no-index::

점검을 수행 할 때 색인을 보지 마십시오.
이것은 사용될 수 있습니다 :

  • 경로가 예를 들어 추적되고 git add .사용자가 예상 한 규칙에 의해 무시되지 않은 이유를 디버그하기 위해
  • 이전에 추가 된 경로와 일치하는 부정을 포함하여 패턴을 개발할 때 git add -f.

4

맨 페이지에서 아무것도 찾을 수 없지만 여기에 각 상위 디렉토리의 파일을 검사하여 git add 할 수 있는지 확인하는 빠르고 더러운 스크립트가 있습니다. 문제점 파일이있는 디렉토리에서 다음과 같이 실행하십시오.

test-add.sh STOP_DIR FILENAME

여기서 STOP_DIRGit 프로젝트의 최상위 디렉토리이며 FILENAME경로가없는 문제 파일 이름입니다. 계층의 각 레벨에서 동일한 이름의 빈 파일을 작성하고 (존재하지 않는 경우) git add -n추가 할 수 있는지 확인합니다 (자체 정리 후). 다음과 같이 출력됩니다.

FAILED:    /dir/1/2/3
SUCCEEDED: /dir/1/2

스크립트 :

#!/usr/bin/env bash
TOP=$1
FILE=$2
DIR=`pwd`
while : ; do
  TMPFILE=1
  F=$DIR/$FILE
  if [ ! -f $F ]; then
    touch $F
    TMPFILE=0
  fi
  git add -n $F >/dev/null 2>&1
  if [ $? = 0 ]; then
    echo "SUCCEEDED: $DIR"
  else
    echo "FAILED:    $DIR"
  fi
  if [ $TMPFILE = 0 ]; then
    rm $F
  fi
  DIR=${DIR%/*}
  if [ "$DIR" \< "$TOP" ]; then
    break
  fi
done 

1

git check-ignore -v filenameBTW 덕분 에 사용의 주된 대답에 추가하기 위해 와일드 카드 다음에 줄 바꿈이 있기 때문에 .gitignore 파일이 모든 것을 차단하고 있음을 알았습니다.

* .sublime-project

예로서. 방금 줄 바꿈을 제거했습니다. 수정되었습니다.

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