gitgitore에 의해 무시되는 특정 파일을 보여주는 Git 명령


645

Git으로 발을 젖게하고 다음과 같은 문제가 있습니다.

내 프로젝트 소스 트리 :

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

공급 업체 지점에 코드 (현재 MEF)가있어 거기서 컴파일 /src/refs하고 프로젝트가 참조 하는 곳 으로 참조를 옮길 것입니다.

내 문제는 .gitignore무시 *.dll하고로 설정 했다는 것 *.pdb입니다. 내가 할 수있는 git add -f bar.dll괜찮 무시 된 파일의 추가를 강제로, 문제는 내가 파일이 무시되는 존재 무엇 목록에 알아낼 수 없습니다입니다.

무시한 파일을 나열하여 파일을 추가하는 것을 잊지 않도록 나열하고 싶습니다.

맨 페이지를 읽었으며 git ls-files제대로 작동하지 않습니다. git ls-files --exclude-standard -i내가 원하는 것을 해야한다고 생각합니다. 내가 무엇을 놓치고 있습니까?


12
요즘에는 git-ls-file을 사용하지 않고 'git ls-files'를 사용합니다.
wojo

7
나는 확인하기 위해 당신과 함께 변론 리야드의 답변을 그 어떤 없다 인정 유일한 사람이기 때문에 알맞은 보장 합니다 (포함 유일한 자식 명령을 사용하여이 작업을 수행하는 방법으로 git clean입증 된 바와 같이 트릭을) 여기가 . 또한 실제로는 .gitignore 파일에주의를 기울이지 않기 때문에 요약에서 "exclude-from"예제를 사용하지 않는 것이 좋습니다. 이 페이지가 Google의 최고 답변이므로 특히이 질문을합니다.
Alexander Bird

"작동 원리 요약"에 대한 빠른 설명 : "Git ls-files"매뉴얼 페이지는 "-i"가 ls 출력에 대해 제외 된 파일을 포함 함을 설명합니다. '느리게'읽을 때까지 같은 오해가있었습니다. ;-)
됩니다

2
답변은 질문을 수정하지 않고 답변 게시물에 포함되어야합니다.
Flimm

나는 git config --global alias.ls ls-files --exclude-standard이 질문에 대한 답을 얻는다 git ls -i.
jthill

답변:


662

노트:


또한 qwertymk답변 에서 언급했듯이 git check-ignore -v적어도 Unix에서 명령 을 사용할 수도 있습니다 ( CMD Windows 세션 에서는 작동하지 않습니다 )

git check-ignore *
git check-ignore -v *

두 번째 규칙은 실제 규칙을 표시 .gitignore하므로 git repo에서 파일을 무시합니다.
유닉스에서 " 현재 디렉토리의 모든 파일을 재귀 적으로 확장합니까? "및 bash4 +를 사용하는 경우 :

git check-ignore **/*

(또는 find -exec명령)

참고 : https://stackoverflow.com/users/351947/Rafi B.의견 에서 (위험한) globstar피할 것을 제안 합니다 .

git check-ignore -v $(find . -type f -print)

.git/그래도 하위 폴더 에서 파일을 제외해야합니다 .


원래 답변 42009)

git ls-files -i

소스 코드가 나타내는 것을 제외하고는 작동해야합니다 .

if (show_ignored && !exc_given) {
                fprintf(stderr, "%s: --ignored needs some exclude pattern\n",
                        argv[0]);

exc_given ?

-i실제로 아무것도 나열 하려면 다음에 하나 이상의 매개 변수가 필요합니다 .

시험:

git ls-files -i --exclude-from=[Path_To_Your_Global].gitignore

(그러나 캐시 된 (무시) 객체 만 필터와 함께 나열 하므로 원하는 것은 아닙니다.)


예:

$ cat .git/ignore
# ignore objects and archives, anywhere in the tree.
*.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git ls-files --ignored \
    --exclude='Documentation/*.[0-9]' \
    --exclude-from=.git/ignore \
    --exclude-per-directory=.gitignore

실제로 'gitignore'파일 ( 'exclude')에서 도움이 될 수있는 명령 줄이 있습니다.

F:\prog\git\test\.git\info>type exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

그래서....

git ls-files --others --ignored --exclude-from=.git/info/exclude
git ls-files -o -i --exclude-from=.git/info/exclude

git ls-files --others --ignored --exclude-standard
git ls-files -o -i --exclude-standard

트릭을해야합니다.

에서 언급 한 바와 같이 LS-파일 man 페이지 , --others캐시되지 않은, 비 최선을 다하고, 정상 무시 파일을 보여주기 위해, 중요한 부분입니다.

--exclude_standard바로 가기 일뿐 아니라 모든 표준 "무시 된 패턴"설정 을 포함하는 방법 입니다.

exclude-standard
: 표준 자식 제외를 추가 .git/info/exclude, .gitignore각 디렉토리에, 그리고 user's global exclusion file.


@VocC, 이 테스트에 대한 나의 이해에서 , 당신이 상단에 추천하는 대답은 단순히 큰 결함을 가질 수 있습니다. 그래서 나는 보통 riyad의 대답을 대신 권장 합니다.
Alexander Bird

2
Git v2.13.2 릴리즈 이후 git status --ignored: github.com/git/git/blob/master/Documentation/RelNotes/…
Pau

1
와우, git check-ignore -v *구성이 적용된 위치를 보여 주므로 훌륭하게 작동합니다. 감사합니다.
Hoang Tran

@MikeD * /를 작동 시키려면 (또는 실제로 ** 할 수있다) shopt -s globstar그 후에는 globstar를 설정 해야 작동한다.
Veda

(위험한) globstar를 사용하지 않으면 :git check-ignore -v $(find . -type f -print)
rafi

482

훨씬 간단한 방법이 있습니다 (git 1.7.6+) :

git status --ignored

.gitignore 파일의 영향을 무시하도록 git-status에 지시하는 방법이 있습니까?를 참조하십시오 .


3
어떤 버전의 자식을 사용하고 있습니까? 내 (1.7.0.4)는 말합니다 error: unknown option 'ignored'. -s링크 된 게시물에 제안 된대로 추가해도 작동하지 않았습니다.
Alexander Bird

3
내 버전은 1.7.6입니다. 다른 버전 1.7.5.1이 필요한 버전 -s입니다. 당신은 시도 할 수 git status -h있는지 확인하기 위해 --ignored지원됩니다
Penghe Geng에게

1
1.7.0.4에서는 아직 지원되지 않는 것 같습니다. 내 다른 컴퓨터에는 1.7.9가 있고
Alexander Bird

4
이 페이지의 모든 솔루션을 시도했습니다. 이것이 최고입니다. 파일과 디렉토리를 모두 표시합니다. 이 질문은 원래 질문되었을 때이 기능을 다시 사용할 수 없었습니다. (그런데, 최소한 모든 단계를 변경하기 전까지는 모든 솔루션이 완전히 새로운 "git init"에서 제대로 작동하지 않을 것입니다.)
wisbucky

12
이것은 허용 된 답변보다 훨씬 낫습니다. git clean -ndX추적되지 않은 파일이 삭제되기 때문에 플래그를 실수로 잊어 버리는 드문 상황이 저장소에 결정적인 영향을 미치기 때문에 솔루션 보다 훨씬 안전 합니다. 따라서 위험합니다. 반대로 git status --ignored잘못 입력하고 기억하는 것이 자연 스럽더라도 항상 안전합니다.
Ioannis Filippidis

400

꽤 깨끗한 또 다른 옵션 (말장난 의도 없음) :

git clean -ndX

설명:

$ git help clean

git-clean - Remove untracked files from the working tree
-n, --dry-run - Don't actually remove anything, just show what would be done.
-d - Remove untracked directories in addition to untracked files.
-X - Remove only files ignored by Git.

참고 :이 솔루션에는 이미 제거 된 무시 된 파일이 표시되지 않습니다.


Nifty ... 그러나 원래 질문을 한 이유는 공급 업체 파일 (* .dll)이 있어야했기 때문에 삭제하는 것이 바람직한 결과가 아니었기 때문입니다. 그러나 : * .dll을 무시하는 것에서 빌드 출력 폴더를 무시하는 것으로 내 벤더 폴더를 무시하는 것으로 전략을 변경 했으므로이 방법을 알아야합니다. 이것은 make clean빌드 서버에 대한 좋은 대안이 될 것이며 빌드 서버에서 매우 유용합니다.
앤드류 번즈

2
git 버전 1.7.0.4를 사용하고 있으며 두 명령 ( 'git ls-files -o -i --exclude-standard', 'git clean -dXn')은 동일하지 않습니다. 첫 번째 파일은 4 개이고 두 번째 파일은 두 개뿐입니다. (.gitignore ~, index.php ~, sql / create_users.sql ~, www / index.php ~) (.gitignore ~ ​​제거, index.php ~ 제거) 내가 여기서 뭔가를 놓치고 있습니까?
Cesar

@VonC, 달콤한! 감사! @Cesar, 확실하지 않습니다. 에 익숙하지 않습니다 git ls-files -o -i --exclude-standard. git clean -dXn항상 내가 원했던 것이었지만 이미 제거 된 무시 된 파일은 표시하지 않습니다. git ls-files -o -i --exclude-standard그렇게 할 수도 있습니다. 이것이 차이를 일으키는 원인 일 수 있습니다.
ma11hew28

3
하나의 작은 것- n실수로 그런 식으로 삭제할 가능성이 적은 첫 번째 타이핑을 입력하는 것이 좋습니다 . git clean -ndX
Tobias Cohen

1
트윗 담아 가기 귀하의 제안으로 답변을 업데이트했습니다. 더 안전합니다. 을 생략하면 nGit의 기본값은 fatal: clean.requireForce defaults to true and neither -n nor -f given; refusing to clean입니다. 여전히 안전하지만 n처음 입력하는 것이 더 안전합니다! :)
ma11hew28 5

39

일반적으로 문제는 해결되지만 모든 상황에서 솔루션이 작동하지는 않습니다. 다음과 같이 repo dir을 가정하십시오.

# ls **/*                                                                                                       
doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2

doc:
index.html

tmp:
dir0  file1  file2

tmp/dir0:
file0

그리고 이와 같은 .gitignore :

# cat .gitignore
doc
tmp/*

이것은 doc아래 의 디렉토리와 모든 파일을 무시합니다 tmp. Git은 예상대로 작동하지만 무시 된 파일을 나열하기 위해 제공된 명령은 작동하지 않습니다. 자식이 무엇을 말해야하는지 살펴 보자.

# git ls-files --others --ignored --exclude-standard                                                            
tmp/file1
tmp/file2

공지 사항 doc목록에서 누락되었습니다. 당신은 그것을 얻을 수 있습니다 :

# git ls-files --others --ignored --exclude-standard --directory                                                
doc/

추가 --directory옵션을 확인하십시오.

내 지식에서 더이없는 번에 모든 무시 파일을 나열하는 명령. 그러나 왜 tmp/dir0전혀 나타나지 않는지 모르겠습니다 .


2
이것은 내가 원하는 것을 얻었지만 다른 사람들은 (내 특별한 경우) ... 고마워하지 않았습니다! 두 개의 명령을 실행 해야하는 것은 실망 스럽지만 무시 된 디렉토리를 사용하면 --directory 옵션이 적어도 그것을 찾은 다음 find 명령으로 파이프하여 파일을 찾을 수 있습니다. 감사!
lindes

이것은 한 번에 모든 작업을 수행하고 디렉토리를 확장합니다.(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory) | perl -nle '$seen{$_}++||next;if(-d){system"find",$_,"-type","f"}else{print}'
Dee Newcum

17

힘내 지금이 기능을 내장

git check-ignore *

물론 당신은 **/*.dll당신의 경우 와 같이 글로브를 변경할 수 있습니다

힘내 참조


7
git check-ignore **/*하위 디렉토리에 파일 포함
mzimmer

이것은 최상위 수준의 dicrectories 만 나열합니다.
Radon8472

13

사용하기에 충분해야합니다

git ls-files --others -i --exclude-standard

그로 덮여있는 모든 것을 다룹니다

git ls-files --others -i --exclude-from=.git/info/exclude

따라서 후자는 중복됩니다.


~/.gitconfig파일에 별명을 추가하여이를 쉽게 수행 할 수 있습니다 .

git config --global alias.ignored "ls-files --others -i --exclude-standard"

이제 입력 git ignored하여 목록을 볼 수 있습니다 . 기억하기 쉽고 입력하기가 더 빠릅니다.

Jason Geng 솔루션의 간결한 표시를 선호하는 경우 다음과 같이 별칭을 추가 할 수 있습니다.

git config --global alias.ignored "status --ignored -s"

그러나 더 자세한 출력은 .gitignore 파일의 문제를 해결하는 데 더 유용합니다. 무시되는 모든 면화 선택 파일이 모두 나열되어 있기 때문입니다. 일반적으로 grep무시할 파일이 있는지 또는 무시하고 싶지 않은 파일이 있는지 확인하기 위해 결과를 파이프합니다 .

git ignored | grep some-file-that-isnt-being-ignored-properly

그런 다음 짧은 디스플레이를보고 싶을 때 기억하고 입력하기가 쉽습니다.

git status --ignored

( -s일반적으로 끌 수 있습니다.)


해당 파일을 수동으로 나열해야하기 때문에 이것은 결코 효과가 없었습니다. git status --ignored데비안 sid에서 작동하지만 매우 새롭지 만… 대중적인 수요로 인해 추가 된 것 같습니다 ;-)
mirabilos

1
"Debian sid에서 작동"이란 "Debian sid에 기본적으로 설치된 Git 버전에서 작동"을 의미한다고 가정합니다. 배포판에 포함 된 유틸리티 버전으로 인해 인질로 잡히지 않도록해야합니다. 배포판 자체와 독립적으로 업그레이드 할 수 있습니다.
iconoclast

12

Git의 여러 gitignore 소스 (GNU를 사용하는 경우)의 어느 위치 에나있는 패턴과 일치하는 작업 트리의 전체 파일 목록을 인쇄하는 방법은 다음과 같습니다 find.

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose

저장소의 현재 분기에있는 모든 파일을 검사합니다 (로컬을 삭제하지 않은 경우).

그리고 특정 gitignore 소스 라인도 식별합니다.

Git은 파일이 이미 추가 되었기 때문에 gitignore 패턴과 일치하는 일부 파일의 변경 사항을 계속 추적합니다. 유용하게도 위 명령은 해당 파일도 표시합니다.

부정적인 gitignore 패턴도 일치합니다. 그러나 이들은로 시작하기 때문에 목록에서 쉽게 구분할 수 있습니다 !.

Windows를 사용하는 경우 Git Bash 에는 GNU가 포함되어 있습니다 find(에서 공개 find --version).

목록이 길고 (있는 경우 rev) 확장명 (약간)으로 표시 할 수 있습니다.

$ cd {your project directory}
$ find . -path ./.git -prune -o -print \
| git check-ignore --no-index --stdin --verbose \
| rev | sort | rev

자세한 내용은 참조하십시오 man find, man git-check-ignore, man rev,와 man sort.

이 전체 접근 방식의 핵심은 Git (소프트웨어)이 빠르게 변화하고 있으며 매우 복잡하다는 것입니다. 대조적으로 GNU find매우 안정적입니다 (적어도 여기서 사용 된 기능들). 따라서 Git에 대한 심층적 인 지식을 표시하여 경쟁력을 원하는 사람은 다른 방식으로 질문에 대답 할 수 있습니다.

가장 좋은 답변은 무엇입니까? 답변은 모듈화 (정보 격리)를 통해 안정성과 단순성이라는 목표를 달성하기 위해 Git 지식에 대한 의존도를 의도적으로 최소화하며 오랫동안 지속되도록 설계되었습니다 .


많은 감사합니다! 새로운 소스 파일 중 일부가 때때로 커밋에서 누락 된 이유를 알아 내기 위해 고심하고있었습니다. bin * 패턴이 있음을 알 수 있습니다. bin *은 bin으로 시작하는 파일 / 디렉토리의 이름과 만 일치하지만 대신 파일 / 디렉토리의 전체 경로에 bin을 포함하는 모든 항목과 일치합니다! 내 문제는 .gitignore에서 패턴 일치의 정확한 의미를 잘못 이해했기 때문에 발생합니다. 귀하의 2 줄 스크립트가이 실수를 찾는 데 도움이되었습니다!
Nicolas Rouquette

1

(다른 답변 연장)

참고 git check-ignore커밋 사용 .gitignore하여 작업 트리에서 하나하지! 자식 히스토리를 오염시키지 않고 가지고 놀려면 자유롭게 편집하고 나서로 커밋하십시오 git commit --amend.

이 문제는 주로 문제의 해결 방법이 필요한 경우 해당 자식이 디렉토리를 따르지 않습니다. 에 입력하십시오 .gitignore:

dirtokeep/**
!dirtokeep/.keep

.keep의 길이가 0 인 파일이어야합니다 dirtokeep.

결과는있을 것 모든 것을 에서 dirtokeep, 무시됩니다 제외시켰다 dirtokeep/.keep 또한 것이됩니다, dirtokeep디렉토리 복제 / 체크 아웃에 건설 될 것이다.


0

무시할 디렉토리가 몇 개 있다고 가정하면 "git status node / logs /"를 사용하여 어떤 파일을 추가해야하는지 알려주십시오. 디렉토리에는 상태 출력의 일부가 아닌 텍스트 파일이 있습니다.

지점 마스터에서
지점은 '원산지 / 마스터'로 최신 상태입니다.
추적되지 않은 파일 :
( "git add ..."를 사용하여 커밋 할 대상에 포함)

    node/logs/.gitignore 

.gitignore는 다음과 같습니다.

*

! .gitignore

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