Git의 화이트리스트 및 하위 디렉터리


91

텍스트 파일 전용 화이트리스트를 만들었습니다.

*
!*.txt

이제 하위 디렉토리에 추적되지 않은 텍스트 파일 sub/dir/file.txt이 있습니다 - , 이것은 표시되지 않습니다 (무시 됨). 그러나 루트 디렉토리의 텍스트 파일은 표시됩니다.

그 이유는 무엇이며 어떻게 수정합니까?



하위 디렉토리에 포함하려는 파일이 있습니까? 그렇다면이 하위 디렉토리는 .gitignore.
fajran

예. 이 파일은 내 예제의 11.1.102.55 폴더만큼 디렉토리 구조가 낮습니다. 중첩은 폴더 / 제품간에 항상 동일하지는 않습니다.
Nate 2012

1
이 기능을 알고 있습니다. 수백 개의 디렉토리가 있습니다. 각 디렉토리에 대해 하나의 gitignore를 만드는 것보다 원하지 않는 파일 유형을 명시 적으로 무시하는 것이 더 빠릅니다. .gitignore 파일에서 화이트리스트 기능을 가져 오는 방법을 찾고 있습니다.
Nate

1
이것이 어떻게 중복되는지 모르겠습니다. 다른 질문은 특정 파일을 허용 목록에 추가하는 방법을 묻는 반면,이 질문은 하위 폴더를 포함한 특정 파일 유형을 허용 목록에 추가하는 방법을 묻습니다. 실제로는 stackoverflow.com/questions/8024924/… 의 복제본과 비슷합니다 .
Big McLargeHuge 2013

답변:


146

그런 식으로 시도하면 구조에서 디렉토리를 블랙리스트에 올리기 때문에 실패합니다.

해결하기 위해, 당신은, 디렉토리가 아닙니다, 당신은 커밋 할 파일 유형 중 하나가 아닌 블랙리스트에 모든 것을 원하는 디렉토리를 블랙리스트 않으면 서 .

.gitignore작업을 수행 할 파일 :

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

세 수준의 구조에서이 테스트를 위해 화이트리스트 .txt의 존재 파일 *.one, *.two그리고 *.three사용하여 파일 .gitignore나를 위해 작품 - 저장소의 루트 디렉토리에 위치한. .gitignore구조의 모든 디렉토리에 파일 을 추가 할 필요는 없습니다 .

대답은 온에서 정보 나 다른 것들 사이에, 그림에 사용 (stackoverflow.com).


18
!.gitignore사용할 때 항목도 필요 *하지 않습니까?
sjas

2
여기 내 대답을 참조하십시오. stackoverflow.com/questions/987142/…/* 최상위 폴더 만 블랙리스트에 추가하는 것이 더 유용 할 수 있지만 모든 폴더를 재귀 적으로 차단하는 것은 아닙니다. 이는 실제로 .gitignore화이트리스트 폴더의 하위 폴더를 조사해서는 안된다는 것을 의미 합니다.
Ryan Taylor

1

이를 달성하는 더 간단한 방법은 다음과 같습니다.

# Blacklist all files...
*.*

# ...except the ones we want
!*.txt

이는 파일 아래의 모든 레벨에 gitignore시작하지 않는 패턴을 적용 하기 때문에 작동 합니다./.gitignore

패턴의 시작 또는 중간 (또는 둘 다)에 구분 기호가있는 경우 패턴은 특정 .gitignore 파일 자체의 디렉토리 수준에 상대적입니다. 그렇지 않으면 패턴은 .gitignore 수준 아래의 모든 수준에서도 일치 할 수 있습니다.

디렉토리 내부의 파일에이 작업을 수행하려면 상황이 더 복잡해집니다.

# Blacklist all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

이것은 다음에 gitignore대한 특별한 규칙 이 있기 때문에 작동 합니다 **.

**전체 경로 이름과 일치하는 패턴에서 연속 된 두 개의 별표 ( " ")는 특별한 의미를 가질 수 있습니다.

  • 슬래시와 연속 된 두 개의 별표, 슬래시는 0 개 이상의 디렉토리와 일치합니다. 예를 들어 " a/**/b"는 " a/b", " a/x/b", " a/x/y/b"등과 일치 합니다.

핵심은 디렉토리를 무시하지 않는 것입니다. 다른 규칙에 관계없이 해당 디렉토리 내의 모든 파일이 무시되기 때문입니다.


0

나는 오랫동안 검색했다.

  1. ~ 100.000 디렉터리가 재귀 적으로 중첩 된 큰 폴더 구조가 있다고 가정합니다. 이 폴더에는 약 30.000 유형의 파일이 있습니다 .txt(제 경우에는 type *.md). 이 *.md파일 옆 에는 추적하고 싶지 않은 500GB (백만 개 이상의) 파일이 있습니다.

  2. 나는 단지 추적 이눔 원하는 .txt(또는 *.md모든 폴더와 하위 디렉토리에) 파일을.

정답은 Git에서는 불가능합니다.

대신 내가 한 일 :

[편집 : 작동하지 않음-심볼릭 링크 (또는 하드 링크)가있는 폴더를 만들고 거기에서 git을 사용하려고 시도했지만 git은 심볼릭 링크를 따르지 않고 하드 링크를 덮어 씁니다. 도!]

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