git rm-치명적 : 경로 사양이 파일과 일치하지 않음


87

실수로 9000 장 이상의 사진을 프로젝트 폴더에 추가했습니다. 그리고 그들을 맡겼습니다. 그런 다음 디스크에서 삭제했습니다. 헌신적이다.

이제 변경 사항을 git 서버에 푸시하려고합니다. 그러나 너무 오래 걸리고 12Gb의 데이터를 보내려고합니다.

디스크의 파일 크기를 확인한 결과 실제로 .git폴더가 12Gb를 차지하는 것을 확인했습니다 .

거기에서 사진을 삭제하는 방법 ? 시도 git rm했지만 실패했습니다.

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

디스크에서 모두 삭제했지만 여전히 .git폴더에 있습니다.

나는 추가하려고 public/photos.gitignore:

public/photos/
*.zip

그러나 결과는 없습니다. 물론 hard reset head프로젝트에 정크 사진이 많지 않은 순간까지도 할 수있었습니다 . 하지만 그 이후로 여러 번 커밋하고 코드를 많이 변경했습니다.

답변:


86

귀하의 경우 git filter-branch대신 git rm.

git rm 더 이상 git에 의해 추적되지 않는다는 의미에서 파일을 삭제하지만 해당 이미지에 해당하는 이전 커밋 객체를 제거하지 않으므로 12GB 이미지에 해당하는 이전 커밋을 계속 푸시해야합니다.

git filter-branch, 다른 한편으로는, 따라서 그들 중 하나를 밀어 필요 멀리하고,뿐만 아니라 이전의 모든 커밋에서 해당 파일을 제거 할 수 있습니다.

  1. 명령 사용

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. 필터 분기가 완료된 후 의도하지 않은 파일이 손실되지 않았는지 확인합니다.

  3. 이제 .gitignore 규칙을 추가하십시오.

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. 이제 밀어

    git push -f origin branch
    

추가 도움 필요 하면 이것 , 이것이것을 확인하십시오 . 더 안전한쪽에 있기 위해이 지침을 진행하기 전에 시스템에 저장소의 백업 복사본을 만드는 것이 좋습니다.

원래 오류 메시지는을 사용하여 이미 추적을 해제했기 때문에 발생하므로 추적 git rm하지 않는 파일을 제거 할 수 없기 때문에 git이 불평합니다. 여기에서 자세한 내용을 읽어보십시오 .


2
이봐, 나는 같은 문제가 있지만 1 단계에서 명령을 입력하면 오류가 발생합니다. 치명적 : 잘못된 개정 '--prune-empty'. 단서가 있습니까?
케빈

@kevin 죄송합니다.이 댓글을 놓쳤습니다. 해당 플래그없이 실행할 수 있습니다. 정리는 빈 커밋 객체를 제거했을 것입니다.
무無

1
이 줄 git add .gitignore && commit -m "ignore rule for photos"은 안 git add .gitignore && git commit -m "ignore rule for photos"
Clone

@Clone 예, 그랬어 야했는데 지금 수정했습니다 :)
mu 無

1
이것은 엄청나게 멋진 대답입니다. 몇 년 동안 내 리포지토리에서 발생했던 문제를 수정했습니다. 감사!
Moshe

18

아주 간단한 대답입니다.

1 단계:

먼저 삭제하려는 추적되지 않은 파일을 추가하십시오.

git add .또는 사용git add <filename> .

2 단계:

그런 다음 rm = remove 및 -f = forcely 명령을 사용하여 쉽게 삭제 git rm -f <filename>하십시오 .


이것은 이전 커밋에 존재하는 파일을 제거하는 OP가 원하는 것을 수행하지 않습니다. git filter-branch다른 곳에서 언급 한대로 사용해야 합니다.
Simon Stevens

9

1 단계

파일 이름을 .gitignore 합니다.

2 단계

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

3 단계

git push -f origin branch

@mu에게 큰 감사를드립니다.


7
... 나는 항상 자식이 이것이 증명해야 할 것보다 더 힘들다고 생각했습니다. 플래그와 quirks는 물론이고 대부분의 git 명령의 존재를 누구도 기억할 수있는 방법은 없습니다. Git 모델은 의미가 있으며 간단한 흐름을 따를 때까지 작동하며 막히 자마자 열심히 막히게됩니다.
Muhammad Umer

2
이것이 나를 위해 작동하는 솔루션입니다. 저는--ignore-unmatch
guhur


1

이 체인은 제 경우에서 작동합니다.

  1. git rm -r WebApplication/packages

확인 git-dialog가 있습니다. "y"옵션을 선택해야합니다.

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

rm대신을 사용하여 삭제 한 파일을 복원했습니다 git rm.

나는 먼저 마지막 해시를 체크 아웃했지만 이것이 필요하다고 생각하지 않습니다.


0

git에서 추적되고 오래된 커밋 된 파일을 제거하려면 아래 명령을 사용할 수 있습니다. 제 경우에는 dist디렉토리 에서 모든 파일을 추적 해제하고 제거하고 싶습니다 .

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

그런 다음 .gitignore더 이상 추적되지 않도록 추가해야합니다 .


-1

중복 디렉토리 (~ web / web)가 rm -rf web있었고 첫 번째 웹 폴더 내부에서 실행했을 때 중첩 된 중복을 제거했습니다 .


죄송합니다! 나는 질문을 잘못 읽었 음에 틀림 없다. 그게 목표라고 생각했습니다
ccsinsf 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.