2011-03-20 4 views
4

Mercurial 저장소를 Git으로 변환 중입니다. 파일 시스템의 일부는 다음과 같습니다..gigignore의 정규 표현식^var/(?! log | .dummy) 및 .vit/log/(?! . 더미)를 .gitignore에서 가져 오는 방법은 무엇입니까?

|-- .gitignore 
|-- .hgignore 
`-- var 
    |-- .dummy 
    |-- asdf 
    `-- log 
     |-- .dummy 
     `-- asdf 

내 .hgignore 파일은 정규 표현식을 사용합니다. 나는 .dummy 파일이 아니라 asdf 파일을 추적 할

^var/(?!\log|.dummy) 
^var/log/(?!\.dummy) 

다음과 같이 내 .hgignore 파일의 일부이다. hg status 반환 :

? var/.dummy 
? var/log/.dummy 

어떻게 .gitignore에서 동일한 효과를 얻을 수 있습니까? 나는 다음을 시도했다 :

/var/**/* 
!/var/.dummy 
!/var/log/.dummy 

그러나 이것은 원하는대로 var/asdf을 무시하지 않을 것이다. var/.dummyvar/log/.dummy을 추적하고 var/asdfvar/log/asdf을 무시하려면 어떻게해야합니까?

+0

'**'는 제외 규칙 패턴에서 특별한 의미가 없습니다. 결국'*'과 같은 의미를 갖게됩니다 ("어떤 깊이에서도 다음과 일치"한다는 의미는 아닙니다). –

답변

10

당신은 단지 당신이 항상 깨끗하고 체크 아웃을 할 때 당신은 아마 /var을 제외한다, 그 특정 (거의 빈) 디렉토리를 얻고 추적 명시 적으로 시작 git add -f var/.dummy var/log/.dummy를 사용하는지 확인하는 자리로 .dummy 파일을 사용하는 경우 자리 표시 자 파일. 효과적인 결과는 사용자가 명시 적으로 추적 한 파일 인 .dummy을 제외한 모든 내용을 무시한다는 것입니다.

반면에 거의 빈 디렉토리의 계층 구조를 var/log 이상으로 확장하려는 경우 약간의 설명을 사용할 수 있습니다.

규칙은 gitignore(5)에 설명되어 있지만 때로는 모든 규칙과이 규칙이 상호 작용하는 방식을 이해하기가 어렵습니다. 중요한 부분은 마지막 규칙이 이기고 나중에 적용되는 디렉토리가 이미 완전히 무시되지 않은 경우에만 효과적 일 수 있다는 것입니다. 즉, 디렉토리를 무시한 경우에는 내용의 일부를 무시하기 전에 해당 디렉토리의 내용을 무시해야합니다 (나머지 내용은 무시한 채로).


자동 var에서 .dummy 파일을 제외한 모든 것을 무시하려면

은,이 일을하는 가장 간단한 방법은 최상위 수준에 그 일을 대신 var 디렉토리에 .gitignore 파일을 넣어 포함한다. 이 솔루션을 다른 SO answer에 설명했습니다.

# var/.gitignore 
* 
!/.gitignore 
!.dummy 
!*/ 
  1. 이 디렉토리 (var)에서 모든 것을 무시합니다.
  2. 그러나이 하나의 .gitignore 파일을 무시하지 마십시오 (이 .gitignore 파일을 추적하기 위해 git add -f을 기꺼이 수행하려면이 파일을 두십시오).
  3. 또한이 디렉토리를 루트로하는 계층 구조 (var)의 깊이에서 .dummy 개의 파일을 무시하지 마십시오.
  4. 또한이 디렉토리 (var) 아래의 모든 디렉토리를 무시하지 마십시오.
    이 규칙이 없으면 첫 번째 규칙은 서브 디렉토리를 무시하고 자식은 .dummy 개의 파일을 찾지 않습니다.

마지막 두 패턴은 후행 슬래시 (즉, *은 다른 문자 외에 슬래시와 일치 함)가 없기 때문에 "재귀 적"패턴입니다. 후행 슬래시는 패턴 만 디렉토리와 일치시킵니다. 선행 및 내장 된 슬래시는 패턴을 .gitignore 파일 (또는 다른 제외 파일의 패턴에 대한 저장소의 루트) 위치에 효과적으로 고정시킵니다.은 dir 아래의 항목과 일치해야하며 (dir/.gitignore에이 후자의 효과로는 /*.o을 사용할 수 있음) 아이디어는 어디에도 일치하지 않아야합니다. 익스 클루 드 패턴을 편집하지 않고 어디서나 var에서 새로운 .dummy 파일 "무시 안함"당신이 var/.gitinore 파일을 용납 할 수없는 경우


는, 당신은 아직도 당신이 무엇을 요구 할 수 있지만, 자동으로 할 수 없습니다.

# .gitignore at root of repository 
/var/* 
!/var/.dummy 

!/var/log/ 
/var/log/* 
!/var/log/.dummy 
  1. .gitignore 파일의 형제 인 var 디렉토리 아래의 모든 것을 무시합니다.
  2. 그러나 var/.dummy은 무시하지 마십시오.
  3. 또한 var/log 디렉토리를 무시하지 마십시오.
  4. 그러나 모든 것을 직접 무시하십시오 (var/log).
  5. 그러나 var/log/.dummy을 무시하지 마십시오.

패턴은 다음과 같습니다 흥미로운 디렉토리 (모든 것이 기본적으로 "unignored"이기 때문에이 처음 건너 뛰기) 거기에 .dummy 파일 무시 안함, 디렉토리에 어떤 무시 무시 안함. 계층 구조의 더 깊은 부분마다 패턴을 반복하십시오.

당신은 직접 var 아래의 디렉토리에 대해 작동하도록 *log을 대체 할 수 있지만, 자동으로 더 깊이있는 디렉토리 (예를 들어이 아니라 var/log/ssh/.dummy를 들어, var/cache/.dummy을 위해 일 것)에 대해 작동하지 않습니다. 이것은 비 후행 슬래시를 사용하고 패턴을 앵커하기 때문입니다. 수동으로 작동 시키려면 더 깊은 부분에 대한 더 많은 제외 규칙을 생성하기 위해 패턴을 반복해야합니다 (흥미로운 dir을 제외시키지 말고, dir의 내용을 무시하고, 파일을 무시하지 않음).

2

.dummy을 정규식과 함께 제외 할 필요는 없습니다. 모든 것을 무시하고 직접 .dummy을 모두 추가하면됩니다.

무시는 상태 명령 결과에만 영향을줍니다.

+0

나는 모든 것을 무시하고'git add -f' placeholder "라는 주 개념을 좋아하지만 exclude 패턴은 단지 status 명령 이상에 영향을 미친다 (예를 들어'git add --all'). –