>

이 트릭을 수행하기로 결정했습니다 :

*
!/dir1/
!/dir2/
!/file1
!/file2

그러나 놀랍게도 그렇지 않았습니다. 별표 앞에 슬래시를 붙이면 효과가있는 것 같습니다. 그러나이 변경 전에 왜 작동하지 않는지 실제로 이해하지 못합니다. 아무도 지적 할 수 있습니까?


  • 답변 # 1

    부정 패턴을 사용하려면  와이즈 비즈 단지 두 가지 규칙을 기억하십시오.

    규칙 1. 파일과 디렉토리는 패턴에서 개별적으로 처리됩니다. 디렉토리를 다시 포함한다고해서 하위 파일/디렉토리도 다시 포함되는 것은 아닙니다.

    I.E. 목표는 ! 내부의 모든 것을 제외한 모든 파일/디렉토리를 제외시키는 것입니다. . 다음은 작동하지 않습니다.

    .gitignore
    
    

    왜? 그 이유는 첫 번째 규칙입니다. 디렉토리 /dir1 이지만  하위 파일/디렉토리가 모두 포함 된 것은 아닙니다. 자식이없는 디렉토리 만 포함하면 자식은 아무것도 의미하지 않습니다 .git은 빈 폴더를 추적하지 않기 때문입니다.

    비교하자면 다음과 같이 작동합니다.

    # CANNOT work
    *
    !/dir1/
    
    

    왜? dir1 이기 때문에  루트 디렉토리의 파일/디렉토리 만 직접 일치하지만 # works /* !/dir1/ 와 같은 서브 디렉토리의 파일/디렉토리는 무시하지 않습니다.  여기. /* 후   dir1 포함  다시, 모든 하위 파일/디렉토리가 자연스럽게 돌아 왔습니다.

    그렇다면 !/dir1/ 이후 왜 다음과 같이 작동하지 않는지 물어볼 수 있습니다.   dir1 의 모든 하위 파일/디렉토리를 포함합니다  다시?

    !/dir1/**
    
    

    이유는 규칙 2에 있습니다.

    규칙 2. 상위 디렉토리가 여전히 무시되는 경우 파일/디렉토리가 다시 포함되지 않습니다.이 규칙을 보려면 SO 질문에 대한 내 답변을 먼저 읽으십시오.

    이전 패턴이 작동하지 않는 이유입니다. 부모 디렉토리 dir1 를 포함하기 위해 다른 부정 패턴을 추가하면  먼저 작동합니다.

    # CANNOT work
    *
    !/dir1/**
    
    
    <시간>

    두 가지 규칙을 이해 한 후 OP 사례에 대한 솔루션은 매우 간단합니다.

    다음은 작동합니다.

    dir1
    
    

    그리고 다음도 작동합니다.

    # works
    *
    !/dir1/
    !/dir1/**
    
    

    다음과 같이 간단하게하기 위해

    /*
    !/dir1/
    !/dir2/
    !/file1
    !/file2
    
    
    * !/dir1/ !/dir1/** !/dir2/ !/dir2/** !/file1 !/file2

관련 자료

  • 이전 sql - sqlite에서 알 수없는 값을 연결
  • 다음 api - nodejs의 SRCDS에서 로그를 수신하는 방법