.gitignore에 나열되었지만 여전히 저장소에있는 파일을 제거하는 방법은 무엇입니까?


327

내 저장소에 무시해야 할 파일이 있는데 .gitignore에 파일을 추가했지만 물론 내 저장소에서 제거되지는 않습니다.

내 질문은, 내 기록을 다시 작성하고 이러한 모든 파일을 쉽게 제거 할 수있는 filter-branch를 사용하는 마술 명령이나 스크립트가 있습니까? 또는 단순히 커밋을 만들어 명령을 제거하는 명령입니까?





경고 : 로컬에서 실제 파일을 제거하지는 않지만 다음 git pull에서 다른 개발자 컴퓨터에서 파일을 제거합니다. 추적되었지만 현재 .gitignore에있는 파일에 대해 Git을“잊어 버리는”방법은 무엇입니까?
Kris Roofe

@Stevoisiak 이것은이 질문의 복제본이 아닙니다. 왜냐하면 이것이 무시 된 모든 파일에 대해 묻고 비슷한 질문보다 더 나은 대답을하기 때문입니다.
Omn

답변:


438

저장소에서 수동으로 제거 할 수 있습니다.

git rm --cached file1 file2 dir/file3

또는 파일이 많은 경우 :

git rm --cached `git ls-files -i --exclude-from=.gitignore`

그러나 이것은 Windows의 Git Bash에서 작동하지 않는 것 같습니다. 오류 메시지가 나타납니다. 다음이 더 잘 작동합니다.

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

이러한 파일없이 전체 기록을 다시 쓰는 것과 관련하여 자동 으로 수행 할 수있는 방법 이 있는지 의심 합니다.
그리고 우리는 역사를 다시 쓰는 것이 나쁘다는 것을 알고 있습니다. :)


2
불행히도 Windows에서 Git Bash 명령은 공백이 포함 된 경로에서 작동하지 않습니다
Nate Bundy

19
@ 컵케잌 감사합니다. git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cached트릭 할 것 같다
네이트 번디

3
창문에서도 같은 문제가 발생했습니다. 나는 powershell을 사용하고 있으며, 제 경우에는 @ samy-dindane이 세 번째 명령을 받아 foreach로 변경했습니다. 이것이되었다git ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias

1
"git ls-files -i --exclude-from = .gitignore"는 매우 유용합니다. .ignore에 의해 어떤 파일이 제외되는지 알려줍니다.
Owen Cao

1
나는이 명령을 찾아서 기뻤지 만 실제로 저장소에서 파일을 제거하지는 않습니다. 2300kB의 이미지를 제거했을 때 리포지토리 크기는 10kB 만 감소했습니다. 예를 들어 저장소를 더 작고 빠르게 전송하는 데 사용할 수 없습니다.
Jan Potužník

343

모든 OS에서 작동하는 더 쉬운 방법은

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

기본적으로 .gitignore에있는 파일을 제외한 모든 파일을 읽었습니다.


1
이것은 repo의 다른 사용자가 풀을 실행하는 데 어떤 영향을 미칩니 까? 더 이상 추적하고 싶지 않은 폴더가 삭제되면 삭제됩니까 ??? 이를 방지 할 수있는 방법
추적

이렇게하면 모든 파일이 가짜 커밋 메시지와 함께 변경된 것으로 표시됩니다!
Haidar Zeineddine

3
가짜 커밋 메시지는 무엇을 의미합니까? 그것은 실제 커밋 메시지입니다 : P 당신은 물론 필요에 따라 메시지를 변경할 수 있습니다 ...
gtatr

1
완전성을 위해 끝에 git push 명령이 필요합니다.
Mariusz Bialobrzeski

1
이 작업을 수행하지 마십시오, 모든 파일에 대한 역사를 제거합니다
agrath

144

.gitignore 의 파일을 추적하지 않으므로 git clean 명령을 사용하여 버전 제어가 아닌 파일을 재귀 적으로 제거 할 수 있습니다 .

드라 이런 git clean -xdn을 수행하고 제거 할 대상을 확인하는 데 사용 합니다.
그런 다음 사용 git clean -xdf하여 실행하십시오.

기본적으로 git clean -h또는 man git-clean(유닉스에서) 도움을 줄 것입니다.

이 명령은 준비 영역에없는 새 파일 도 제거 합니다.

도움이 되길 바랍니다.


6
이것은 정답입니다. 실제로 작동합니다 (macOS에서는 받아 들여진 대답이 효과가 없었습니다). 더 깨끗합니다.
Roger Oba

25
이 답변은 적용되지 않습니다 - 영업 이익은 파일에서 말한다 .gitignore 되어 추적되고.
Ken Williams

20
조심해! 이렇게하면 분기에서 단순히 제거하는 대신 추적되지 않은 모든 파일이 영구적으로 삭제됩니다.
Emmanuel

1
git clean -xdn삭제되지 않습니다 예행 연습이다. 다음 것입니다.
JohnZaj

17
-1 : 원본 포스터가 파일을 완전히 제거하지 않고 리포지토리에서 제거하려고했습니다. IDE에 필요한 많은 동적 파일을 삭제하는 데 가깝지만 저장소에있을 필요는 없습니다.
Auspice

4

sed를 사용하여 .gitignore 문의 출력을 조작하여 매우 간단한 솔루션을 수행했습니다.

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

설명:

  1. .gitignore 파일을 인쇄하십시오
  2. 인쇄물에서 모든 설명을 제거
  3. 빈 줄을 모두 삭제
  4. 줄의 시작 부분에 'git rm -r'을 추가하십시오
  5. 모든 줄을 실행하십시오.

10
sed간단합니까?
IgorGanapolsky

0

리눅스에서는이 명령을 사용할 수 있습니다 :

예를 들어 "* .py ~"를 삭제하고 싶습니다. 그래서 내 명령은 ==>이어야합니다.

find . -name "*.py~" -exec rm -f {} \;


-3

git은 .gitignore에 파일을 추가하면 .gitignore 패턴과 일치하는 파일을 무시합니다.

그러나 저장소에 이미 존재하는 파일은 계속 남아 있습니다.

git rm files_ignored; git commit -m 'rm no use files'무시 된 파일을 삭제 하는 데 사용 합니다.


4
그것들이 많이 있습니다. 이름을 지정하지 않고 삭제할 수 있습니까?
Intrepidd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.