추적되었지만 현재 .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.