커밋 된 파일에 .gitignore 적용


436

무시하고 싶은 많은 파일을 커밋했습니다. 앞으로 커밋에서 이러한 파일을 무시하도록 git에 어떻게 알릴 수 있습니까?

편집 : 저장소에서도 제거하고 싶습니다. 이 파일은 빌드 후 또는 사용자 별 툴링 지원을 위해 생성 된 파일입니다.



8
@ Wooo 대답은 비슷할 수 있지만이 질문은 내가 직면하고 해결해야 할 문제를 정확하게 설명합니다.
rjmunro

1
이것은 직접 자식의 repo에 최소한의 변경으로 제목 문제를 해결 대답입니다 : stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

답변:


471

12
그래도 많은 파일이 있습니다. 나는 모든 것을 위해 이것을하고 싶지 않다
user880954

1
공통 디렉토리에 파일이 있습니까? 그렇지 않은 경우, 문제는 자식이 아닌 쉘 사용 질문으로 줄어 듭니다.
Matt Ball

12
'초기 커밋이 끝날 때까지 .gitignore를 추가하는 것을 잊었습니다'모드가 필요합니다.
Luke Puplett

9
답은이 아래에 있습니다.
Lopsided 2016 년

3
그렇게 할 수 있도록 플래그 -r을 추가하도록 요청했습니다.
Vishal Gulati

599

.gitignore무시 된 파일과 일치하도록 편집 한 후 git ls-files -ci --exclude-standard제외 목록에 포함 된 파일을 볼 수 있습니다 . 그런 다음 할 수 있습니다

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

디스크에서 삭제하지 않고 저장소에서 제거합니다.

편집 : .gitconfig 파일에 별칭으로 추가하여 언제든지 언제든지 실행할 수 있습니다. [alias] 섹션 아래에 다음 줄을 추가하십시오 (Windows 또는 Mac의 경우 필요에 따라 수정).

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

( -r에서 플래그 xargs방지 git rm빈 결과에서 실행하고 사용법 메시지를 인쇄,하지만 GNU의 findutils의에 의해 지원 될 수에서. 다른 버전 xargs또는 유사한 옵션이 표시되지 않을 수 있습니다.)

이제 당신은 git apply-gitignore당신의 레포를 입력 할 수 있으며 , 당신을 위해 일을 할 것입니다!


10
나는 Mac 용 xargs에 -r이 없다고 생각하거나 내 버그가 있거나 오래된 것입니다. 모릅니다 ... 그리고 왜 !전 git입니까? 글쎄 ... 내 하나는로 일했다 alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino

18
Windows에서for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett

이것은 단지 .gitignore 파일에 나열된 파일을 무시하고 .gitignore 파일을 제거했습니다.
Hippyjim

@Hippyjim 파일이 이미 커밋 된 경우 (.gitignore에 나열되어 있음에도 불구하고) .gitignore가 아직 커밋 되지 않은 경우 예상 결과가됩니다. 그렇지 않으면 귀하의 경우 어떤 일이 일어나고 있는지 잘 모르겠습니다.
Jonathan Callen

1
Mac 사용자의 경우 -r기본값이며 BSD 버전에서는 허용되지 않습니다. 따라서 제거하십시오 -r.
Weishi Zeng

136

파일을 리포지토리에 남겨두고 향후 변경 사항은 무시하십시오.

git update-index --assume-unchanged <file>

그리고 이것을 취소하려면 :

git update-index --no-assume-unchanged <file>

이 방법으로 설정된 파일을 찾으려면 다음을 수행하십시오.

git ls-files -v|grep '^h'

http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/ 에 대한 원래 답변에 대한 크레딧


1
: Chronial는 디렉토리를 재귀 적으로이 일에 대한 좋은 대답이 stackoverflow.com/a/16346756/1101076
jordan314

IDE 구성을 커밋하고 싶지만 불필요한 변경 사항을 추적하지 않았습니다. 이것은 저장소를 체크 아웃하는 다른 사람들에게 효과가 있는지 확실하지 않지만 작동합니다. git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchanged도움 이 된다면 결합 할 수 있습니다 .
dlamblin

7
이것은 제목 질문에서 요구하는 것을 정확하게 하는 유일한 대답입니다. 완전한! 이러한 다른 답변의 대부분은 불필요하게 파일을 망쳤습니다.
kayleeFrye_onDeck

1
이것이 바로 질문에 대한 정답입니다. 와 같은 명령을 사용하면 git rm --cached리포지토리에서 파일이 제거되므로 퀴즈가 필요하지 않습니다. 감사합니다. 정말 감사. 당신의 대답은 저에게 많은 도움이됩니다.
ramwin

88

실제 리포지토리가 최신 버전인지 확인하십시오

  1. .gitignore원하는대로 편집
  2. git rm -r --cached .
  3. git add .

평소처럼 커밋


14
질문에 구체적으로 제거 할 파일이 많이 있다고 말 했으므로 받아 들일만한 대답이어야합니다.
nbeuchat

3
2 단계는 큰 저장소가있는 경우 시간이 걸릴 수 있습니다.
brainbag

이로 인해 색인에서 모든 파일 이 제거되었습니다 ! : 저를 저장 git reset HEAD(변경 사항을 은닉하는 것을 잊지 마십시오)
aksh1618

2
2 단계는 모든 것을 제거하지만, 3 단계는 .gitignore로 인해 실패한 것을 제외하고 모두 읽어야합니다.
ojchase

11

오래된 질문이지만 우리 중 일부는 git-posh(파워 쉘)에 있습니다. 이것이 그 해결책입니다.

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

이 단계를 따르세요:

  1. gitignore파일 경로 추가

  2. 이 명령을 실행

    git rm -r --cached foldername
    
  3. 평소대로 변경 사항을 커밋하십시오.

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