Git에서 무시 된 디렉터리의 하위 디렉터리 무시


100

디렉토리를 무시했지만 그 안의 특정 하위 디렉토리를 무시하고 싶다고 가정 해 보겠습니다. 그래서 설정이 있습니다.

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

그리고 KEEP_ME디렉토리를 제외한 모든 것을 무시하고 싶습니다 . 무시가 다음과 같이 보이기를 바랍니다.

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

그러나 그것은 작동하지 않으며 동일한 주제에 대한 여러 순열도 마찬가지입니다.

작동하는 하나는

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

하지만 조금 제한적이고 장황하다고 느껴지나요?


1
제공 한 코드가 작동하지 않았습니다 (git 버전 1.9.1 사용). 효과가있는 것은 / uploads / *! / uploads / rubbish / / uploads / rubbish / *! / uploads / rubbish / stuff / uploads / rubbish / stuff / *! / uploads / rubbish / stuff / keep (예와 유사) 에서 git-scm.com/docs/gitignore ). 내 폴더 구조; └ README.md └ 업로드 / foo는 / 바 / 잃게 / lose.txt └ 업로드 / 쓰레기 / 재료 / / keep.txt 유지
gihanchanuka

답변:


119

gitignore 문서의 패턴 형식 섹션에 따르면 :

선택적 접두사 "!" 패턴을 부정합니다. 이전 패턴에서 제외 된 일치 파일은 다시 포함됩니다. 해당 파일의 상위 디렉토리가 제외 된 경우 파일을 다시 포함 할 수 없습니다. Git은 성능상의 이유로 제외 된 디렉토리를 나열하지 않으므로 포함 된 파일의 패턴은 정의 된 위치에 관계없이 영향을주지 않습니다. 첫 번째 "!"앞에 백 슬래시 ( "\")를 넣으십시오. 리터럴 "!"로 시작하는 패턴 (예 : "! important! .txt")

따라서 이전에 제외 된 상위 디렉터리 /uploads/rubbish/stuff/keep/패턴은 콘텐츠를 부정하기 전에 배타적으로 부정되어야합니다.

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

내부 /uploads/rubbish/stuff/keep/에 하위 디렉터리를 포함하려면 세 번째 줄을 추가합니다.

!/uploads/rubbish/stuff/keep/**/*

1
어떤 버전의 git을 사용하고 계셨습니까? 특정 버전에서만 사용할 수있는 것일 수도 있습니다.

어리둥절한. 이 댓글을 게시하는 것을 잊었습니다. 그래도 작동했습니다. FWIW, 나는 선행 슬래시를 사용하지 않습니다. 그게 문제 였는지 기억이 나지 않습니다. 1.7.2.5를 사용하고 있습니다.

모든 * .zip 파일을 무시한 전역 gitignore 파일이 있습니다. 그러나 특정 프로젝트의 경우 zip 파일을 포함하고 싶습니다. 그 프로젝트의이 라인을 추가 .gitignore하고 그것! : 좋은 작품!*.zip
Jinghao시

폴더 를 제외하고 하위 폴더를 포함하는 동안 지정된 폴더 앞뒤에 임의의 디렉토리를 명시 적으로 지정해야 합니다 . ( 전체 답변 ).
Josiah Yoder

이 방법은 작동하지 않습니다 (git 2.25 현재-git의 내용이 변경되었을 수 있음). 나는 수정으로 아래 에 stackoverflow.com/a/60288435/295691을 게시했습니다 .
user295691

34

에 무언가를 추가하더라도 git이 색인에 추가 하도록 강제.gitignore 할 수 있습니다.

git add --force uploads/rubbish/stuff/KEEP_ME/

그러나 "KEEP_ME"는 디렉토리 인 것처럼 보이며 git은 일반적으로 빈 폴더를 좋아하지 않으므로 폴더가 비어있는 경우 대신 "placeholder"-holder 파일을 추가해야합니다.

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

유일한 문제는이 특정 예제가 내가 언급 했어야하는 글로벌 gitignore를 참조한다는 것입니다. 항목을 강제로 추가 할 수 있다는 것을 알고 있지만 새 항목이 추가되면 처음에 새 저장소마다 추가해야합니다. .keep은 내용이 무시되지 않도록 보장합니까?

1
약간의 테스트를했습니다. 예,의 git add --force모든 새 항목 또는 폴더에 대해을 사용해야 합니다 KEEP_ME. 그러나 그 후에 git add -u는 파일이 '무시'된 것처럼 업데이트가 추가됩니다 ( 예 : a 를 수행 할 때 ). 는 .keep_me그 자식 폴더에서 작동하므로, 그 단지 파일을 아무 작업도 수행하지 않습니다.
commonpike

1
git add --force이것에 대한 잘못된 해결책입니다. 디렉토리를 이동하거나 파일을 다른 디렉토리로 이동하면 git의 추적은 파일을 삭제하지만 새 위치에 추가하지 않으므로 git add --force다시 수행해야 합니다. 일반적인 패턴을 무시하면 git은 저장소 내에서 파일의 이동을 추적합니다.
멀린

이것은 나를 위해 일한 유일한 솔루션입니다. 내 폴더는 무시되지 않았지만 어떤 방법으로도 추가 할 수 없습니다. 이 방법으로 해결되었습니다.
Akito

6

일반 제외가있는 모든 폴더를 제외 할 때 특정 폴더를 포함하는 방법을 찾으려고했습니다.

**/build

/*일반 제외 끝에 를 추가하면 모든 빌드 파일을 계속 제외합니다.**/build/*

그런 다음 포함하려는 경로를 수정하기 위해 다른 줄을 추가합니다.

!**/folder/build/* 

우리에게 읽는 gitignore를 남겨주세요

**/build/* 
!**/folder/build/* 

2

Buo-Ren LinJohn 의 답변은 매우 도움이되었지만 둘 다 결합해야했습니다.

업로드 내 파일뿐만 아니라 다른 하위 폴더 를 제외하려면 폴더를 제외하고 하위 폴더를 포함하면서 지정된 폴더 앞에 임의의 디렉토리를 명시 적으로 지정해야 합니다.

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

또한 폴더와 하위 폴더 내의 항목을 모두 표시하려면 하위 폴더와 그 내용을 모두 명시 적으로 다시 포함해야합니다.


한숨. 여기에 행운이 없습니다. 지금 몇 시간 동안. Git 2.20.1
RichieHH

@ HörmannHH 유감입니다. 새로운 질문을 할 때가 되었나요?
Josiah Yoder

2

가장 많이 찬성 된 답변으로 제시된 솔루션은 정확하지 않으며 쉽게 입증 할 수 있습니다.

업로드에있는 모든 것을 무시하는 것으로 시작 / * :

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

이제 위와 같이 무시 된 항목의 상위 디렉토리를 무시합니다.

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

추적되지 않은 파일을 표시하지 않습니다.

작동 시키려면 uploads/트리 아래의 모든 파일 ( uploads/**/*, 최상위 수준뿐만 아니라) 을 무시한 uploads/*다음 유지하려는 트리의 모든 상위 디렉토리를 추가해야합니다.

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

다음을 제공합니다.

On branch master
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        uploads/rubbish/stuff/KEEP_ME/a

우리가 사용했다면 uploads/*.gitignore위의 잘, 그래서 예를 들어로서, 모든 중간 파일이 포함되었을 것이다 uploads/rubbish/a위의 상태 명령에 표시됩니다.

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