새로운 .gitignore 파일과 git repo 재 동기화


192

gitignore 파일을 업데이트 한 후 git 저장소를 "새로 고침"할 수 있습니까?

방금 gitignore에 더 많은 무시 (?)를 추가하고 새 파일과 일치하는 저장소에 이미있는 항목을 제거하고 싶습니다.


1
이것은 stackoverflow.com/questions/1139762/gitignore-file-not-ignoring 과 비슷하지 않습니까?
VonC

솔루션이 새로운 gitignore와 일치하는 이미 커밋 된 파일을 삭제합니까?
Christian Wattengård

100
"무시"라는 단어를 발명 한 +1
Aasmund Eldhuset 1


1
@ user770 : 오늘 나는 배웠다!
Aasmund Eldhuset 2016 년

답변:


371

" .gitignore 파일을 무시하지 않음 "에 언급 된 솔루션 은 약간 극단적이지만 작동해야합니다.

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( 아래의 jball037 주석과 같은 사건을 피하기 위해 유지하려는 변경 사항을 먼저 커밋하십시오 . 이 옵션은 디스크의 파일을 그대로 유지합니다.)
--cached

또한 블로그 게시물 " Git에서 이미 추적 된 파일을 무시하도록 만들기 "에보다 세분화 된 솔루션이 있습니다 .

git rm --cached `git ls-files -i --exclude-standard`

Bassim그의 편집에서 제안합니다 :

경로에 공간이있는 파일

과 같은 오류 메시지가 표시 fatal: path spec '...' did not match any files되면 경로에 공백이있는 파일이있을 수 있습니다.

옵션을 사용하여 다른 모든 파일을 제거 할 수 있습니다 --ignore-unmatch.

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

그러나 일치하지 않는 파일은 저장소에 남아 있으며 경로를 큰 따옴표로 묶어 명시 적으로 제거해야합니다.

git rm --cached "<path.to.remaining.file>"

git add 단계가 불필요하다는 것을 알았습니다 .git rm --cached 후에 git status를 실행하면 제거 된 파일이 이미 준비 영역에 있으며 계속 진행하여 커밋 할 수 있습니다.
chap

3
방금 이것을 실행하고 커밋되지 않은 모든 변경 사항을 잃어 버렸고 거의 직장에서 사임을 발표했습니다. 이 글타래에 허용 된 답변으로 내 생명을 구했습니다 : stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC 죄송합니다. 그것은 rant 또는 stick이 아닙니다. :) 그렇습니다. --cached를 사용했고 파일을 확인할 때 커밋되지 않은 모든 변경 사항이 손실되었습니다. 잠시 당황했지만 "git reset HEAD"가 내 파일을 복원했습니다 (그러나 이번에는 .gitignore에 지정한 파일이 없어서 솔루션이 여전히 작동했습니다!)
jball037

3
잘 했어. 경고를 추가하고 그에 따라 답변을 편집했습니다.
VonC

1
이 작업을 수행하기 전에 한 줄만 더 읽으면 "(jball037과 같은 사건을 피하기 위해 유지하려는 변경 사항을 먼저 커밋해야합니다"#fml
Aiden Strydom

9

이해가 안될 수도 있지만 새로 무시한 파일을 삭제하려고합니까? 아니면 이러한 파일의 새로운 수정 사항을 무시 하시겠습니까? 이 경우 문제가 해결 된 것입니다.

이전에 커밋 된 무시 된 파일을 삭제하려면

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

작은 따옴표는 무엇입니까?
IgorGanapolsky 2016 년

이것은 훌륭한 답변입니다
Holene

이것은 내가이 작은 업데이트의 두를 필요로하지만 내 .gitignore를 업데이트 한 후 파일을 제거하는 이유는 매우 간단하다 :``자식 RM -cached git ls-files -i –exclude-standard 자식은``-m '정리 커밋
아론

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 파일 이름에 공백이 있으면 gracchus의 솔루션이 작동하지 않습니다. 공백이있는 파일 이름에 대한 VonC의 솔루션은을 사용하여 파일 이름을 제거하지 않고 --ignore-unmatch수동으로 제거하는 것이지만 많은 경우 잘 작동하지 않습니다.

다음은 bash 배열을 사용하여 모든 파일을 캡처하는 솔루션입니다.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

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