git : 존재하지 않는 모든 파일을 무시하는 방법?


131

자식 리포지토리에서 추적되지 않은 모든 파일과 폴더를 무시하는 편리한 방법이 있습니까?
(에 대해 알고 .gitignore있습니다.)

따라서 git status다시 깨끗한 결과를 제공 할 것입니다.



또는 .gitignore 파일에 단일 *를 추가 할 수 있습니다. :)
vilicvane

1
단지 *의지가 당신이 원하는 것이 아닐 것입니다.
sjas


너무 많은 오답에 놀랐습니다. -u no잘못되었습니다. -uno맞다. ! -u no라는 파일에서 상태를 시도합니다 no. 에 대한 인수 no아닙니다-u . 에 no대한 인수로 해석되도록 하려면 -u공백이 없어야합니다. 이것을 테스트 touch Invalid하려면를 수행 하고 비교 git status -uInvalid하십시오 git status -u Invalid.
Aaron McDaid

답변:


251

이미 말했듯이 상태에서 제외하려면 다음을 사용하십시오.

git status -uno  # must be "-uno" , not "-u no"

대신 현재 추적되지 않은 파일을 영구적으로 무시하려면 프로젝트 루트에서 다음을 시작하십시오.

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

이후의 모든 호출 git status은 해당 파일을 명시 적으로 무시합니다.

업데이트 : 위의 명령에는 약간의 단점이 있습니다. .gitignore아직 파일 이 없으면 gitignore가 자체를 무시합니다! 이는 파일 이 실행 .gitignore되기 전에 파일 이 생성되기 때문에 발생합니다 git status --porcelain. 따라서 .gitignore아직 파일 이 없으면 다음을 사용하는 것이 좋습니다.

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

이 완료 서브 쉘 생성 하기 전에.gitignore 파일이 만들어집니다.

명령 설명 내가 많은 투표를 받고있을 때 (감사합니다!) 나는 그 명령을 조금 더 잘 설명 할 것이라고 생각합니다.

  • git status --porcelain대신 사용 git status --short하기 때문에 수동 상태가 "스크립트 쉬운 구문 분석 형식으로 출력을 지정합니다.이 짧은 출력과 비슷하지만 자식 버전에서 안정적인 관계없이 사용자 구성에 남아있을 것이다." 따라서 파싱 성과 안정성이 모두 있습니다.
  • grep '^??'git status manual?? 에 따르면 추적되지 않은 파일에 해당하는로 시작하는 행만 필터링 합니다.
  • cut -c4- 모든 줄의 처음 3자를 제거하여 추적되지 않은 파일의 상대 경로를 제공합니다.
  • |기호는 파이프 다음 명령의 입력 이전 명령의 출력을 전달;
  • >>>기호는 리디렉션 연산자 파일에 덮어 쓰기 또는 이전 명령의 출력을 추가 / 각각 새로운 파일을 생성한다.

및 대신에 사용sed 하는 것을 선호하는 사람들을위한 또 다른 변형 다음 과 같은 다른 방법이 있습니다.grepcut

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- 모든 줄의 처음 4자를 제거하여 추적되지 않은 파일의 상대 경로를 제공합니다. 번호 -c는 잘라낼 열 번호 목록의 시작을 나타냅니다. 그리고 열 4에서 끝까지의 행을 4- 선택 하여 열 1-3을 자릅니다. 따라서 cut 명령은 실제로 각 줄의 처음 3자를 제거합니다. 이 파일에 대한 것과 같은 git status line에서 4자를 제거했다면 : ?? app/views/static_pages/contact.html.erb의 첫 글자를 제거 할 것입니다 app. 따라서 명령은 정확하지만 설명이 잘못되었습니다.
7stud

@ 7stud : 고마워요, 당신이 맞아요, 실수로 4를 썼습니다. 나는 대답을 수정했다.
Diego

2
나는 명령 설명에 정말 감사합니다. 인터넷에서 복사 한 임의의 명령이 무엇을하고 있는지 알면 좋으며, 명령 줄 사용법과 사용법을 배우는 데 도움이됩니다.
Eric Fitting

1
-u no나를 위해 작동하지 않습니다. 그러나 -uno그렇습니다. 이에 따라 답변을 업데이트했습니다. 이것은 git의 이상한 디자인입니다. 나는 자식 1.7.1에있다
Aaron McDaid

2
@AaronMcDaid : 감사합니다. 변경 사항은 여기 에 문서화되어 있으며 여기 에서 설명 합니다
Diego

51

이러한 파일을 영구적으로 무시하려면 파일을 추가하는 간단한 방법 .gitignore은 다음과 같습니다.

  1. 자식 트리의 루트로 변경하십시오.
  2. git ls-files --others --exclude-standard >> .gitignore

이것은 추적되지 않은 디렉토리 내의 모든 파일을 열거하며, 원하는 디렉토리 일 수도 있고 아닐 수도 있습니다.


3
왜 이렇게 많은 표를 얻지 못합니까? 다른 2 개의 프로그램을 통해 파이프 할 필요가 없습니다!
JoelFan

4
@JoelFan : 두 가지 이유 : 1) 이것은 git의 루트에서만 작동 하지만 허용되는 것은 모든 하위 디렉토리에서 작동하지만 대상 .gitignore경로 를 조정하면됩니다 2) 추적되지 않은 디렉토리가있는 경우이 목록은 각각 그 안에 모든 단일 파일이 있지만 추적되지 않은 디렉토리 자체 는 아닙니다 (따라서 디렉토리를 무시하지 않으므로 디렉토리의 미래 파일을 추적되지 않은 것으로 여전히보고됩니다. 반면 허용되는 파일은 디렉토리 만 나열하고 내부의 추적되지 않은 파일은 나열하지 않습니다) 이것은 당신이하고 싶은 일의 문제이지만, 종종 당신은 단지 전체 디렉토리를 무시하고 싶어합니다
Diego

1
감사합니다. Poolie 감사합니다. @Diego가 언급 한 점 때문에 제안 의 차이점 감사드립니다. 파일 및 폴더 라이브러리로 작업하기 시작했으며 원본 파일을 추적 / 푸시하고 싶지 않습니다. 라이브러리에서 추가하거나 다시 빌드 한 파일 만 추적하고 싶습니다. 부모 폴더를 추가하면 모든 것이 무시됩니다. 이 / 귀하의 솔루션은 모든 1696 파일을 한 번에 추가했습니다. xD
카오스 7703

을 사용하여 달성 할 수도 있습니다 git config status.showUntrackedFiles no.
larsch

16

매뉴얼 에서 찾았습니다

mode 매개 변수는 추적되지 않은 파일 처리를 지정하는 데 사용됩니다. 선택 사항입니다. 기본값은 모두이며, 지정된 경우 옵션에 붙어 있어야합니다 (예 : -uno는 아니지만 -uno).

git status -uno


39
글을 게시하기 전에 모든 사람이 RTFM을한다면 우리 중 누구도 rep :-)을받지 못할 것입니다.
Jenny D

4

두 가지 방법:

git-status에 "-uno"인수를 사용하십시오. 예를 들면 다음과 같습니다.

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

또는 파일과 지시문을 .gitignore에 추가 할 수 있으며,이 경우 절대 표시되지 않습니다.


2
.gitignore존재 를 편집하는 편리한 방법 git status | cat >> temp && vim temp. 그런 다음 파일을 편집하여 처음 몇 줄과 마지막 줄을 삭제하고 후행 #과 공백을 삭제하십시오. 그런 다음 cat temp >> .gitignore && rm temp. .gitignore이전에 존재 하지 않았 으면 mv temp .gitignore할 것입니다. 추악하지만 .gitignore수동으로 업데이트하는 것보다 낫습니다 .
sjas

1
이 답변은 잘못되었습니다. 정답은 -uno입니다. 를 사용하는 경우 -u no와 동일합니다 no -u. 파일 no이 존재하지 않는 파일에서 상태를 수행 하고 기본 -u모드를 사용 합니다. 즉, 다음과 같습니다git status no
Aaron McDaid

3

-u no스테이지되지 않은 파일도 표시되지 않습니다. -uno원하는대로 작동하고 스테이지되지 않은 상태로 표시되지만 추적되지 않은 상태로 숨 깁니다.


1
이조 차도 정확하지 않습니다. ( 에 대한 인수가 아님 git status -u X)와 같습니다 . 이는 인수가없는 것이 기본값 이기 때문에 차례로 같습니다 . 따라서 파일의 git-status 일뿐 입니다. 경우에 따라서, 이다 단순히라는 파일에 자식 상태 작업을 시도 당신은 아마이없는,git status X -uX-ugit status X-u-uXXnono
아론 McDaid

2

OS 와 같은 Unix를 사용하지 않는 경우 PowerShell을 사용하여 Windows에서 작동 합니다.

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

그러나 .gitignore파일에는 빈 줄이 새로 있어야합니다. 그렇지 않으면 내용이 있더라도 마지막 줄에 텍스트가 추가됩니다.

이것은 더 나은 대안이 될 수 있습니다.

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

당신은 할 경우 많은 비 추적 파일을, 그리고 "싶지 않아 gitignore, 그들 모두"때문에,주의 자식 1.8.3 (2013 년 4 월 22D) , git status을 언급 할 것이다 --untracked-files=no당신이에 해당 옵션을 추가하지 않은 경우에도를 처음!

" git status"은 사용자에게 --untracked=no옵션이 너무 오래 걸릴 때 옵션 을 사용하는 것을 제안합니다 .


0

약간 다른 문제를 해결하려고 여기에 왔습니다. 아마도 이것은 다른 사람에게 유용 할 것입니다 :

새 지점을 만듭니다 feature-a. 이 분기의 일부로 새 디렉토리를 만들고 일부를 억제하려면 .gitignore를 수정해야합니다. 이것은 다양한 캐시 폴더를 생성하는 프로젝트에 새로운 도구를 추가 할 때 많이 발생합니다. .serverless, .terraform

다시 마스터로 병합하기 전에 다른 것이 나오므로 master다시 체크 아웃 하십시오.git statusgitgitore가 아직 병합되지 않았기 때문에 다시 억제 된 폴더를 다시 선택합니다.

여기에 대한 답변은 실제로 간단하지만 알아 내기 위해이 블로그 를 찾아야 했습니다.

feature-a지점 에서 .gitignore 파일을 체크 아웃하십시오.

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.