추적되었지만 현재 .gitignore에있는 파일에 대해 Git을“잊어 버리는”방법은 무엇입니까?


5395

에 의해 추적 된 git파일이 있지만 이제 파일이 .gitignore목록에 있습니다.

그러나 파일을 git status편집 한 후에도 해당 파일이 계속 표시됩니다 . 어떻게 git완전히 잊어 버리 도록 강요 합니까?


16
git clean -X비슷하게 들리지만이 상황에서는 적용되지 않습니다 (파일이 여전히 Git에 의해 추적되는 경우). 나는 잘못된 길을 따르지 않는 해결책을 찾는 사람을 위해 이것을 쓰고 있습니다.
— imz-Ivan Zakharyaschev 12

35
이에 대한 유일한 대답은 아래에 있습니다 git update-index --assume-unchanged. 이 솔루션 1) 파일을 서버에 유지 (인덱스), 2) 파일을 로컬에서 자유롭게 수정할 수 있습니다.
— Qwerty

8
다음을 --skip-worktree참조하십시오 : stackoverflow.com/questions/13630849/…
— Doppelganger

77
중요한 질문은 파일이 저장소에 남아 있어야합니까? 예를 들어 누군가 새로운 저장소를 복제하는 경우 파일을 가져와야합니까? 경우 예는 다음 git update-index --assume-unchanged <file>올 바르고 파일이 저장소에 유지되며 변경으로 추가되지 않습니다 git add. NO 인 경우 (예 : 캐시 파일, 생성 된 파일 등) git rm --cached <file>저장소에서 해당 파일 을 제거합니다.
— Martin

9
@Martin @Qwerty Everyon은 --assume-unchangedgit이 큰 추적 파일의 상태를 확인하지 못하게하는 성능에 대한 조언을 중단해야 하지만 --skip-worktree사용자가 더 이상 커밋하지 않으려는 수정 된 추적 파일을 선호합니다 . 참조 stackoverflow.com/questions/13630849/...
— 필립

답변:


5695

.gitignore추적되지 않은 파일 add -f이 git에 의해 추적되는 파일 세트에 (없이 ) 추가되는 것을 방지 하지만 git은 이미 추적중인 파일을 계속 추적합니다.

파일 추적을 중지하려면 색인에서 파일을 제거해야합니다. 이것은이 명령으로 달성 할 수 있습니다.

git rm --cached <file>

전체 폴더를 제거하려면 해당 폴더의 모든 파일을 재귀 적으로 제거해야합니다.

git rm -r --cached <folder>

헤드 수정에서 파일 제거는 다음 커밋에서 발생합니다.

경고 : 이렇게하면 로컬에서 실제 파일이 제거되지 않지만 다음에 다른 개발자 컴퓨터에서 파일이 제거됩니다 git pull.


55
나를 위해 workd 1. 처음 2. 자식 RM --cached <파일> 보류중인 변경 내용을 커밋하고 다시 다시 3를 저지 자식 상태 .gitignore, 검사에 파일을 추가하고 커밋이었다 과정
— mataal

117
매우 중요한 추가. 무시 된 파일이 수정되지만 (이것에도 불구하고 커밋되어서는 안 됨) 수정 및 실행 git add .후에는 색인에 추가됩니다. 그리고 다음 커밋은 그것을 저장소에 커밋합니다. 이것을 피하기 위해 모든 mataal이 하나 이상의 명령을 말한 직후에 실행하십시오.git update-index --assume-unchanged <path&filename>
— Dao

32
@ AkiraYamamoto의 방법은 저에게도 효과적이었습니다. 저의 저장소에는 수천 개의 파일이 있기 때문에 출력을 억제했습니다.git rm -r -q --cached .
— Aaron Blenkush

85
git pull그래도 파일이 삭제됩니다 .
— Petr Peller

22
git rm --cached <file>은 리포지토리에서 파일을 제거하고 git update-index --assume-unchanged <file>은 파일을 비 단계적 변경으로 표시하지 않으며 새로운 변경 사항을 가져 오지 않습니다. 그러나 나는 파일 불만의 무시 무시한 콘텐츠를 원한다
— Igor Semin

2609

아래의 일련의 명령은 작업 디렉토리 또는 로컬 저장소가 아닌 Git 인덱스에서 모든 항목을 제거한 다음 git 무시를 고려하면서 Git 인덱스를 업데이트합니다. 추신. 인덱스 = 캐시

먼저:

git rm -r --cached . 
git add .

그때:

git commit -am "Remove ignored files"

또는 하나의 라이너 :

git rm -r --cached . && git add . && git commit -am "Remove ignored files"

197
이 답변과 허용되는 답변의 차이점을 강조 표시하려면이 명령을 사용하여 영향을받는 파일을 실제로 알 필요는 없습니다. (색인에서 지워야 할 임의의 파일이 많은 임시 디렉토리를 상상해보십시오).
— Ludwig

53
허용 된 답변과 동일합니다. 에 파일이 삭제됩니다 git pull.
— Petr Peller

73
이것을 표준 git 명령으로 사용하는 것이 좋습니다. 같은 것 git rmignored.
— Berik

12
@gudthing -r은 "재귀"를 나타냅니다
— Mark

14
이로 인해 현재에없는 다른 쓸모없는 파일이 추가 될 수 있습니다 .gitignore. git status이 명령 후 소음 이 얼마나 큰지 확인하기 어려울 수 있습니다 . 새로 무시 된 파일 만 제거 하는 명령이 더 좋습니다. 이것이 제가 thSoft의 답변을
— KurzedMetal

1122

git update-index 는 나를 위해 일합니다.

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

참고 :.gitignore gitignore는 추적되지 않은 파일에만 해당되므로이 솔루션은 실제로 독립적입니다 .

편집 : 이 답변이 게시 된 후 새로운 옵션이 생성되었으며 선호해야합니다. 당신은 사용해야하는 --skip-worktree사용자가 더 이상 저지 및 유지 싶지 않아 수정 추적 파일 인 --assume-unchanged큰 추적 된 파일의 상태를 확인하기 위해 자식을 방지하기 위해 성능. 자세한 내용은 https://stackoverflow.com/a/13631525/717372 를 참조하십시오 ...

git update-index --skip-worktree <file>

173
이것은 IS 진짜 대답. 실제로 매우 간단하지만 오염되지 않으며 git status실제로 매우 직관적입니다. 감사.
— Pablo Olmos de Aguilera C.

4
rm [...] .적어도 나는 그것이 어떻게 작동했는지 파악할 수 있었으므로 충분한 해결책을 찾았습니다. 나는 무엇에 더 큰 문서를 찾을 수 없습니다 update-index& --assume-unchanged수행하십시오. 누구나 무시했을 모든 파일을 제거하고 싶다는 점에서 다른 방법과 비교할 수 있습니까? (또는 명확한 설명을위한 링크?)
— Brady Trainor

25
git update-index --assume-unchanged <path> …git이에 관계없이 지정된 경로의 변경 사항을 무시하도록합니다 .gitignore. 원격에서 당기고 해당 원격 에이 경로가 변경된 경우 git은 충돌로 인해 병합에 실패하고 수동으로 병합해야합니다. git rm --cached <path> …git이 해당 경로 추적을 중지시킵니다. 경로를 추가하지 않으면 .gitignore나중에 경로가 표시됩니다 git status. 첫 번째 옵션은 git commit 히스토리에서 노이즈가 적으며 "무시 된"파일에 대한 변경 사항을 나중에 배포 할 수 있습니다.
— ManicDee

26
이것이 어떻게 받아 들여지지 않는지에 대해 상당히 혼란 스럽습니다. 여기서 받아 들여진 대답은 실제로 묻는 실제 질문에 대답하지 않습니다. 이 답변은 저장소에서 파일을 제거하지 않으면 서 저장소에있는 파일의 변경 사항은 무시합니다.
— Dave Cooper

11
이 명령은 주어진 명령이 수행하는 작업, 예를 들어 다른 제안 된 솔루션과의 차이점을 정확하게 설명하면 훨씬 유용합니다.
— LarsH

283
git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

무시 된 파일 목록을 가져 와서 인덱스에서 제거한 다음 변경 사항을 커밋합니다.


7
작업 디렉토리에서 제거 해야하는 경우 간단히 실행하십시오 git ls-files --ignored --exclude-standard | xargs git rm . 이 답변이 최고라고 생각합니다! 매우 명확하고 유닉스 방식이기 때문에 다른 복잡한 명령의 부작용을 구성하지 않고 직접 원하는 방식으로 원하는 것을 수행합니다.
— imz-Ivan Zakharyaschev 12

6
큰 대답; 그러나 중간에 공백이있는 경로가 있으면 명령이 실패합니다 (예 : "My dir / my_ignored_file.txt"
— David Hernandez

8
git ls 파일-무시-표준 제외 | sed 's /.*/"&"/'| xargs git rm --cached
— David Hernandez

3
git rmls-files아무것도 일치하지 않으면 불평합니다 . 사용 xargs -r git rm ...말할 xargs실행하지 git rm아니 파일이 일치하지 않는 경우.
— 볼프강

10
\ 0을 구분 기호로 사용하는 것이 좋습니다.git ls-files --ignored --exclude-standard -z|xargs -0 git rm --cached
— Nils-o-mat

83

추적되지 않은 파일을 제거하기 위해 항상이 명령을 사용합니다. 한 줄의 유닉스 스타일의 깨끗한 출력 :

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

무시 된 모든 파일을 나열하고 내부에 공백이있는 경로를 처리하기 위해 모든 출력 줄을 따옴표 줄로 바꾸고 git rm -r --cached색인에서 경로 / 파일 / 디렉토리를 제거 하기 위해 모든 것을 전달 하십시오.


3
훌륭한 솔루션! 완벽하게 작동하고 모든 파일을 제거한 다음 다시 추가하는 것이 더 정확하다고 느낍니다.
— Jon Catmull

5
나도이 "깨끗한"것을 발견했다. 당연하지만 첫 번째 부분 만 실행하면 git ls-files --ignored --exclude-standard새 파일 .gitignore에서 제외 / 제거 할 파일을 먼저 이해하고 확인할 수 있습니다 git rm.
— JonBrave

"불쾌한"문자가 포함 된 파일 이름은 실패합니다 (예 :) \n. 이를 위해 솔루션을 게시했습니다.
— JonBrave

3
또 다른주의 사항 : 끌어 당길 때 파일이 다른 사람의 작업 디렉토리에서 삭제됩니다.
— LarsH

sed: 1: "s/.*/": unterminated substitute in regular expression공백이있는 저장소의 filter-branch 명령에서 시도했지만 작동하지 않았습니다 . (하지만 필터 지점 외부에서 작동하는 것으로 보입니다). 내가 사용 git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached에서 JonBrave의 @ 대답 대신.
— goofology

70

그것을 밖으로 옮기고, 저지른 다음 다시 안으로 옮기십시오. 이것은 과거에 저에게 효과적이었습니다. 이것을 달성하는 'gittier'방법이있을 것입니다.


2
이전에 무시되지 않은 많은 파일을 무시하고 싶을 때 유용했습니다. 당신이 말했듯이, 아마도 더 좋은 방법이있을 것입니다.
— Oskar Persson 16:28에

이것이 바로 내가 한 일입니다. 파일을 git 외부의 폴더로 이동 한 다음 "git add.", "git commit"을 수행하십시오. (이것은 파일을 제거했습니다) 그런 다음 파일 / 폴더를 참조하여 gitignore를 추가하고 gitignore 파일을 git에 추가 한 다음 다시 폴더로 복사 / 이동하면 무시됩니다. 주의 사항 : 파일이 GIT에서 삭제 된 것처럼 보이므로 위의 솔루션에서 언급 한 것처럼 다른 체크 아웃 / 풀에서 파일을 제거 할 것입니다. 그러나 처음에 파일을 복사하기 때문에 IMHO 문제가 아닙니다. 팀원들에게 알려
— Del

이것은 잘못 커밋 된 폴더를 제거하는 가장 쉬운 방법입니다.
— Martlark

1
내가 볼 수있는 유일한 방법 인 것 같습니다. git의 거대한 버그 ( '기능'이 아님)는 .gitignore에 파일 / 폴더를 추가하자마자 그 시점에서 그 파일을 영원히-어디서나 무시하지 않습니다.
— JosephK

이것은 내가 그것들을 추가 한 후에 효과가 있었고, 사실이 그것들을 .gitignore에 추가 한 후에 작동했습니다
— hanzolo

66

당신은 할 수없는 경우 git rm다른 사람은 (경우에도 경고를해야 할 수있는 추적 파일 때문에 당신이 git rm --cached 다른 사람이 변화를 얻을 때, 자신의 파일은 그 파일 시스템에서 삭제됩니다). 이는 구성 파일 재정의, 인증 자격 증명 등으로 인해 종종 수행됩니다. 사람들이 문제를 해결 한 방법 은 https://gist.github.com/1423106 을 참조하십시오 .

요약:

  • 응용 프로그램이 무시 된 파일 config-overide.ini를 찾도록하고 커밋 된 파일 config.ini에서이 파일을 사용하도록하십시오 (또는 ~ / .config / myapp.ini 또는 $ MYCONFIGFILE)
  • config-sample.ini 파일을 커밋하고 config.ini 파일을 무시하고 필요한 경우 파일을 스크립트 또는 이와 유사한 복사본으로 만듭니다.
  • gitattributes clean / smudge 마술을 사용하여 변경 사항을 적용하고 제거하십시오 (예 : 대체 브랜치에서 구성 파일을 체크 아웃으로 번지거나 HEAD에서 구성 파일을 체크 아웃으로 정리). 이것은 까다로운 일이므로 초보자에게는 권장하지 않습니다.
  • 구성 파일을 마스터 전용으로 병합되지 않는 전용 배치 브랜치에 보관하십시오. 배포 / 컴파일 / 테스트하려는 경우 해당 분기로 병합하고 해당 파일을 가져옵니다. 이는 휴먼 머지 정책 및 여분의 git 모듈을 사용하는 것을 제외하고는 기본적으로 얼룩 / 깨끗한 접근 방식입니다.
  • 반 추천 : 변경하지 않은 것으로 가정하지 마십시오. 눈물 만 남습니다 (git 거짓말 자체가 변경 사항이 영원히 손실되는 것처럼 나쁜 일이 발생할 수 있기 때문에).

7
git은 파일을 삭제할 때 더러워지면 파일을 제거하지 않습니다. 더러워지지 않으면 파일을 검색하는 것이 쉬울 것입니다 git checkout <oldref> -- <filename>-그러나 체크 아웃되고 무시됩니다.
— amenthes

마지막 메모 (약 --assume-unchanged) 와 관련하여 : 이것은화물 컬트이며 해산되어야하거나 왜 (내가 확신하는) 설명하고 유용하게 사용할 수 있는지 설명 할 수 있습니다.
— RomainValeri

57

다음과 같은 경우에 사용하십시오.

1. 많은 파일을 추적 해제하거나

2. gitignore 파일을 업데이트했습니다

소스 링크 : http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

git 저장소에 이미 일부 파일을 추가 / 커밋 한 다음 .gitignore에 추가한다고 가정 해 봅시다. 이러한 파일은 여전히 ​​저장소 색인에 있습니다. 이 기사에서는 그것들을 제거하는 방법을 볼 것입니다.

1 단계 : 모든 변경 사항 커밋

계속하기 전에 .gitignore 파일을 포함하여 모든 변경 내용이 커밋되었는지 확인하십시오.

2 단계 : 저장소에서 모든 항목 제거

저장소를 지우려면 다음을 사용하십시오.

git rm -r --cached .
  • rm 은 제거 명령입니다
  • -r 재귀 제거를 허용합니다
  • –cached 는 색인에서 파일 만 제거합니다. 파일은 여전히 ​​존재합니다.

rm명령은 용서 될 수 있습니다. 미리 수행하려는 작업을 시도하려면 -n또는 --dry-run플래그를 추가하여 테스트하십시오.

3 단계 : 모든 것을 다시 추가

git add .

4 단계 : 커밋

git commit -m ".gitignore fix"

귀하의 저장소는 깨끗합니다 :)

변경 사항을 리모컨으로 푸시하여 변경 사항을 적용하십시오.


1
원격 저장소에서 파일을 삭제하지 않습니까? 로컬 리포지토리와 원격 리포지토리에 파일을 모두 유지하지만 git을 잊어 버리려면 어떻게해야합니까?
— Avishay28

AFAIK 이것은 히스토리 변경 명령을 사용하지 않기 때문에 히스토리에서 파일을 삭제하지 않습니다 (잘못된 경우 수정). 역사적인 커밋
— Dheeraj Bhaskar

49

git filter-branch 사용 하여이 작업을 수행했습니다 . 내가 사용한 정확한 명령은 매뉴얼 페이지에서 가져 왔습니다.

경고 : 전체 기록에서 파일을 삭제합니다

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

이 명령은 git rm각 커밋 전에 실행되어 전체 커밋 기록을 다시 만들어 지정된 파일을 제거합니다. 이 같은 명령을 실행하기 전에 백업하는 것을 잊지 마세요 것이다 손실.


9
모든 커밋 ID가 변경되므로 리포지토리 복사본 외부의 브랜치에서 병합이 중단됩니다.
— bdonlan

19
경고 : 전체 기록에서 파일이 삭제됩니다. 이것은 오래 전에 버전 기록에서 커밋 된 완전히 불필요하고 큰 크기의 파일 (커밋해서는 안 된 출력)을 제거하기 위해 찾고 있던 것입니다.
— zebediah49

48

나에게 효과가 없었던 것

(Linux에서) 여기에 ls-files --ignored --exclude-standard | xargs git rm -r --cached접근 방식을 제안하는 게시물을 사용하고 싶었습니다 . 그러나 제거 될 파일 중 일부에는 \n이름에 개행 / LF /가 포함 되어 있습니다. 해결책 중 어느 것도 :

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

이 상황에 대처하십시오 (파일을 찾을 수 없다는 오류가 발생합니다).

그래서 나는 제안한다

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

이것은 사용 -z에 인수 LS-파일 과 -0에 인수 용 xargs 수용하고 파일 이름에 안전 / 올바르게은 "불쾌한"문자를.

매뉴얼 페이지 git-ls-files (1) 에는 다음과 같이 명시되어 있습니다.

-z 옵션을 사용하지 않으면 경로 이름의 TAB, LF 및 백 슬래시 문자가 각각 \ t, \ n 및 \\로 표시됩니다.

파일 이름에 이러한 문자가 있으면 솔루션이 필요하다고 생각합니다.


1
나에게 이것은 최고의 솔루션입니다. 보다 성능이 뛰어납니다 git add .. 또한 위의 일부 의견에서 가장 개선 된 내용이 포함되어 있습니다.
— Nils-o-mat

git commit -am "Remove ignored files"나중에 thSoft 를 답에 추가 할 수 있습니까 ? J : 결합 귀하의 답변은 일을 통해 저를 얻었다
— 간도

의 목적을 이해하지 못합니다 git commit -a. 나를 위해 git rm --cached정확하게 인덱스에 영향을 미치므로 파일을 스테이징 할 필요가 없습니다.
— Jean Paul

23
  1. .gitignore파일 업데이트 – 예를 들어 추적하지 않으려는 폴더를 추가하십시오 .gitignore.

  2. git rm -r --cached .– 원하거나 원치 않는 것을 포함하여 모든 추적 된 파일을 제거하십시오. 로컬로 저장 한 코드는 안전합니다.

  3. git add .–의 파일을 제외한 모든 파일이 다시 추가됩니다 .gitignore.


올바른 방향으로 우리를 가리키는 @AkiraYamamoto에게 모자 팁.


1
어쨌든 rm을 재귀 적으로 실행하기 위해 -r이 필요하기 때문에 실제로 작동하지 않는다는 사실 때문에 다운 투표는 어떻습니까? :) (누군가 올바르게 복사하지 않았습니다)
— Aran Mulholland

1
경고 :이 기술은 실제로 git이 파일을 무시하지 않고 대신 git이 파일을 삭제하도록합니다. 즉,이 솔루션을 사용하면 다른 사람이 git pull을 수행 할 때마다 파일이 삭제됩니다. 따라서 실제로 무시되지 않습니다. 원래 질문에 대한 해결책은 git update-index 제안하는 솔루션을 참조하십시오.
— orrd

16

아마도 git은 그 개념 때문에 파일을 완전히 잊을 수 없다고 생각합니다 ( "스냅 샷, 차이가 아닌 부분"섹션 ).

예를 들어 CVS를 사용할 때이 문제는 없습니다. CVS는 정보를 파일 기반 변경 목록으로 저장합니다. CVS에 대한 정보는 일련의 파일과 시간에 따른 각 파일의 변경 사항입니다.

그러나 Git에서는 프로젝트 상태를 커밋하거나 저장할 때마다 기본적으로 해당 시점의 모든 파일 모양을 캡처하고 해당 스냅 샷에 대한 참조를 저장합니다. 따라서 파일을 한 번 추가하면 해당 스냅 샷에 항상 파일이 나타납니다.

이 두 기사가 도움이되었습니다.

자식 가정 변경되지 않은 대 건너 뛰기 작업 트리 및 Git을 사용하여 추적 된 파일의 변경 사항을 무시하는 방법

파일을 이미 추적 한 경우 다음을 수행합니다.

git update-index --skip-worktree <file>

이 순간부터이 파일의 모든 로컬 변경 사항이 무시되고 원격으로 이동하지 않습니다. 원격에서 파일이 변경되면, 충돌이 발생 git pull합니다. 스 태쉬가 작동하지 않습니다. 이를 해결하려면 파일 컨텐츠를 안전한 곳에 복사 하고 다음 단계를 수행하십시오.

git update-index --no-skip-worktree <file>
git stash
git pull 

파일 내용은 원격 내용으로 대체됩니다. 안전한 장소에서 파일로 변경 사항을 붙여넣고 다시 수행하십시오.

git update-index --skip-worktree <file>

프로젝트를 수행하는 모든 사람이 수행 할 git update-index --skip-worktree <file>경우 문제가 pull없어야합니다. 이 솔루션은 모든 개발자가 자신의 프로젝트 구성을 가질 때 구성 파일에 적합합니다.

원격에서 파일이 변경 될 때마다이 작업을 수행하는 것이 매우 편리하지는 않지만 원격 컨텐츠로 덮어 쓰지 않도록 보호 할 수 있습니다.


16

다음 단계를 순차적으로 수행하면 문제가 해결됩니다.

1. 실수로 추가 한 파일 을 디렉토리 / 스토리지에서 제거 하십시오 . "rm -r"(linux의 경우) 명령을 사용하거나 디렉토리를 찾아서 삭제할 수 있습니다. 또는 PC의 다른 위치로 옮기십시오. [ 이동 / 제거를 위해 실행중인 경우 IDE를 닫아야합니다 .]

2. 파일 / 디렉토리를 gitignore파일에 추가하고 저장하십시오.

3. 이러한 명령을 사용하여 자식 캐시 에서 제거하십시오 (두 개 이상의 디렉토리가있는 경우이 명령을 반복적으로 실행하여 하나씩 제거하십시오)

git rm -r --cached path-to-those-files

4.now 할 A가 커밋 푸시 , 이러한 명령을 사용합니다. 이것은 것입니다 자식에서 해당 파일을 원격 제거 와 자식하게 추적 정지 해당 파일을.

git add .
git commit -m "removed unnecessary files from git"
git push origin

13

복사 / 붙여 넣기 답변은 git rm --cached -r .; git add .; git status

이 명령은 이미 Git 리포지토리에 커밋 된 파일을 무시하지만 이제 파일을에 추가했습니다 .gitignore.


9

Matt Fear의 답변이 가장 효과적인 IMHO였습니다. 다음은 Windows에있는 사용자가 제외 목록과 일치하는 git repo에서 파일 만 제거하는 PowerShell 스크립트입니다.

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

어떤 상황에서이 파일 목록이 재귀 캐시와 같지 않습니까?
— John Zabroski

8

파일을 안전한 위치로 옮기거나 복사하면 손실되지 않습니다. 그런 다음 파일을 git rm하고 커밋하십시오. 이전 커밋 중 하나 또는 제거되지 않은 다른 브랜치로 되 돌리면 파일이 계속 표시됩니다. 그러나 이후의 모든 커밋에서 파일을 다시 볼 수는 없습니다. 파일이 git ignore에 있으면 파일을 폴더로 다시 이동할 수 있으며 git은 볼 수 없습니다.


34
git rm --cached디스크에서 파일을 삭제하지 않고 색인에서 파일을 제거하므로 이동 / 복사 할 필요가 없습니다
— bdonlan

7

은 Using git rm --cached명령하면 원래의 질문에 대답하지 않습니다

git[파일]을 완전히 잊어 버리 려면 어떻게해야 합니까?

실제로이 솔루션을 사용하면 !를 실행할 때 파일 이 저장소의 다른 모든 인스턴스에서 삭제됩니다git pull .

파일이 GitHub의에 의해 설명되어 있습니다에 대한 힘의 자식에 대한 올바른 방법은 잊지 여기 .

설명서를 읽는 것이 좋지만 기본적으로는 다음과 같습니다.

git fetch --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch full/path/to/file' --prune-empty --tag-name-filter cat -- --all
git push origin --force --all
git push origin --force --tags
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

full/path/to/file파일의 전체 경로로 바꾸십시오 . 에 파일을 추가했는지 확인하십시오 .gitignore.

git history를 변경하기 때문에 저장소에 빨리 감기가 아닌 푸시 를 (일시적으로) 허용해야합니다 .


5

BFG는 이 (-에 - 네 - 전류 지르지) 파일 어떤 큰 역사를 제거하는 간단한 플래그가 있으므로 특히, 망할 놈의 repos에서 큰 파일이나 암호 같은 원치 않는 데이터를 제거하기 위해 설계되었습니다 '--strip-blobs- 보다 큰'

$ java -jar bfg.jar --strip-blobs-bigger-than 100M

이름으로 파일을 지정하려면 다음을 수행하십시오.

$ java -jar bfg.jar --delete-files *.mp4

BFG는 git filter-branch보다 10-1000x 빠르며 일반적으로 사용하기가 훨씬 쉽습니다 . 자세한 내용 은 전체 사용 지침 및 예제 를 확인하십시오.

출처 : https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html


5

CLI를 사용하지 않고 Windows에서 작업하는 경우 매우 간단한 해결책은 TortoiseGit 을 사용 하는 것입니다. 메뉴에 "삭제 (로컬 유지)"작업이 있습니다.


5

JonBrave의 답변이 마음에 들었지만 커밋하는 작업 디렉토리가 너무 어려워서 조금 무섭습니다. 그래서 여기 내가 한 일이 있습니다.

git config --global alias.exclude-ignored '! git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r-캐시 && git ls-files -z --ignored --exclude-standard | xargs -0 git stage && git stage .gitignore && git commit -m "새로운 gitignore 및 인덱스에서 무시 된 파일 제거" '

그것을 분해 :

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • 색인에서 무시 된 파일 제거
  • 스테이지 .gitignore 및 방금 제거한 파일
  • 범하다

4

이것은 더 이상 최신 git (작성 당시 v2.17.1) 의 문제가 아닙니다 .

는 .gitignore마지막으로 추적-하지만 삭제 된 파일을 무시합니다. 다음 스크립트를 실행하여 직접 테스트 할 수 있습니다. 마지막 git status진술은 "커밋 할 사항 없음"을보고해야합니다.

# Create empty repo
mkdir gitignore-test
cd gitignore-test
git init

# Create a file and commit it
echo "hello" > file
git add file
git commit -m initial

# Add the file to gitignore and commit
echo "file" > .gitignore
git add .gitignore
git commit -m gitignore

# Remove the file and commit
git rm file
git commit -m "removed file"

# Reintroduce the file and check status.
# .gitignore is now respected - status reports "nothing to commit".
echo "hello" > file
git status

git이 지금이 기쁘다. 그러나 OP는 .gitignore에있는 파일의 수정 사항을 추적하지 말고 삭제 된 파일이 여전히 상태를 표시하지 않는지 묻고있었습니다.
— mrturtle

2

이미 커밋 된 경우 DS_Store:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

다음과 같이 무시하십시오.

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

마지막으로 커밋하십시오!


2

특히 IDE 기반 파일의 경우 다음을 사용합니다.

예를 들어 slnx.sqlite는 다음과 같이 완전히 제거했습니다.

git rm {PATH_OF_THE_FILE}/slnx.sqlite -f
git commit -m "remove slnx.sqlite"

이러한 파일 중 일부는 프로젝트에 대한 일부 로컬 사용자 설정 및 환경 설정 (열린 파일 등)을 저장한다는 점을 명심하십시오. 따라서 IDE에서 탐색하거나 일부 변경을 수행 할 때마다 해당 파일이 변경되므로 커밋되지 않은 변경 사항이 있는지 확인하여 표시합니다.


2

받아 들여진 대답은 " 파일에 대해 Git을 "잊어 버린다 " ... (역사적으로) 아닙니다 . git 만 무시합니다.현재 / 미래의 파일을 하도록 .

이 방법은 git이 무시한 파일 ( 과거 / 현재 / 미래)을 완전히 잊게 하지만, 그렇지 않습니다 작업 디렉토리에서 아무것도 삭제 (원격에서 다시 당기더라도).

이 방법의 사용이 필요합니다 /.git/info/exclude(선호) 또는 기존 .gitignore 의 모든 파일이 커밋 잊어 / 무시합니다. 1

git을 적용하는 모든 방법은 사후 행동을 무시하고 이력을 효과적으로 다시 작성 하므로이 프로세스 후에 가져올 수있는 공개 / 공유 / 공동 작업 저장소에 상당한 영향 을 미칩니다. 2

일반적인 조언 : 정리 된 저장소로 시작하십시오 – 커밋 된 모든 것, 작업중인 디렉토리 나 인덱스에 보류중인 것 없음, 백업을 만드십시오 !

또한, 코멘트 / 개정 역사 의 이 답변 ( 및 개정 역사 의 이 질문은 ) 계몽 / 유용 할 수 있습니다.

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch

git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch

git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#Commit to prevent working directory data loss!
#this commit will be automatically deleted by the --prune-empty flag in the following command
#this command must be run on each branch

git commit -m "ignored index"

#Apply standard git ignore behavior RETROACTIVELY to all commits from all branches (--all)
#This step WILL delete ignored files from working directory UNLESS they have been dereferenced from the index by the commit above
#This step will also delete any "empty" commits.  If deliberate "empty" commits should be kept, remove --prune-empty and instead run git reset HEAD^ immediately after this command

git filter-branch --tree-filter 'git ls-files -z --ignored --exclude-standard | xargs -0 git rm -f --ignore-unmatch' --prune-empty --tag-name-filter cat -- --all

#List all still-existing files that are now ignored properly
#if this command returns nothing, it's time to restore from backup and start over
#this command must be run on each branch

git ls-files --other --ignored --exclude-standard

마지막으로 아래 명령에 대한 중요한 경고 / 정보가 포함 된 이 GitHub 안내서 (6 단계에서 시작) 의 나머지 부분을 따르십시오 .

git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

현재 수정 된 원격 저장소에서 가져온 다른 개발자는 백업을 수행 한 후 다음을 수행해야합니다.

#fetch modified remote

git fetch --all

#"Pull" changes WITHOUT deleting newly-ignored files from working directory
#This will overwrite local tracked files with remote - ensure any local modifications are backed-up/stashed

git reset FETCH_HEAD

각주

1/.git/info/exclude 위의 지침을 사용하여 모든 기록 커밋에 적용 할 수 있기 때문에 .gitignore파일 이 필요한 기록 커밋에 파일 을 가져 오는 방법에 대한 자세한 내용 은이 답변의 범위를 벗어납니다. .gitignore마치 내가 처음 한 것처럼 루트 커밋에 적절한 것을 원했습니다 . 커밋 히스토리 /.git/info/exclude의 .gitignore존재 위치에 관계없이 동일한 것을 달성 할 수 있기 때문에 다른 사람들은 신경 쓰지 않을 수 있으며, 파급 효과를 알고있을 때도 히스토리를 명확하게 다시 작성하는 것은 매우 감동적인 주제 입니다.

FWIW는 잠재적 인 방법이 포함될 수 있습니다 git rebase또는 git filter-branch사본 것을 외부 .gitignore 각으로가에 대한 답변처럼, 커밋 이 질문에

2 독립형 git rm --cached명령 의 결과를 커밋하여 사실을 무시하고 git ignore 동작을 강제 실행하면 나중에 강제 푸시 된 원격 장치에서 끌어 올 때 새로 무시 된 파일이 삭제 될 수 있습니다 . --prune-empty다음 git filter-branch명령 의 플래그 는 이전의 "무시 된 파일 모두 삭제"인덱스 전용 커밋을 자동으로 제거하여이 문제를 방지합니다. 다시 쓰기도 자식 역사를 변경합니다 해시, 커밋 위력을 과시 공개 / 공유 / 협업의 repos에서 미래 당긴를. 이러한 리포지토리에이를 수행하기 전에 파급 효과를 완전히 이해하십시오 . 이 GitHub 안내서 는 다음을 지정합니다.

에 공동 작업자에게 REBASE , 하지 병합, 그들은 이전 (오염) 저장소 역사 오프 작성된 분기합니다. 한 번의 병합 커밋을 통해 방금 퍼지 문제를 겪은 오염 된 기록의 일부 또는 전부를 다시 소개 할 수 있습니다.

대체 솔루션을 하지 않는 원격 REPO에 영향을 미치지는 git update-index --assume-unchanged </path/file>나 git update-index --skip-worktree <file>의 예를 찾을 수 있습니다 여기에 .


0

Windows에서 어려움을 겪고 있고 전체 폴더를 무시하려면 'cd'를 '폴더'에 놓고 'Git Bash Here'를 수행하십시오.

git ls-files -z | xargs -0 git update-index --assume-unchanged

0

내 경우에는 제거해야 할 여러 디렉토리에 여러 개의 .lock 파일이 있습니다. 나는 다음을 실행했고 그것을 제거하기 위해 각 디렉토리로 갈 필요없이 작동했습니다.

git rm -r --cached **/*.lock

이렇게하면 내가있는 '루트'아래의 각 폴더로 이동하여 패턴과 일치하는 모든 파일을 제외했습니다.

이것이 다른 사람들을 돕기를 바랍니다!

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