2017-05-18 1 views
0

실수로 내 git 저장소에 추가 된 "npz, species_coex.npz"파일이 있습니다. 실수를 깨닫고 git rm으로 제거했다. 이제는 그 자식이 여전히 그것에 대해 알고 있다는 것을 알았습니다. (보통 좋았지 만, 처음에는 절대 추가하지 않은 것처럼 자식을 완전히 잊어 버렸습니다.)저장소에서 파일을 영구적으로 제거하십시오. git

필자는 filter-branch 명령에 대해 읽었지만 사용하지 않으려 고합니다. 나는 this을 읽은

, 그들은 추천 :

$ git filter-branch --tree-filter 'rm -f "npz, species_coex.npz" ' HEAD 

내가 오류 얻을 : (때문에 빈 공간,

fatal: ambiguous argument 'npz, species_coex.npz': unknown revision or path not in the working tree 

잘 모르겠어요,이 문제가 발생하는 이유를하는 나는 그것을 인용문에 넣었거나 파일이 현재 머리에 없기 때문에 그렇지 않습니까? 이 파일을 어디에서 찾을 수 있는지 어떻게 말할 수 있습니까?

그리고 방법이 있습니까, 필터 분기없이이 작업을 수행 할 수 있습니까? 파일을 한 번만 추가 한 다음 제거하면 기록이 매우 간단합니다.

+1

'--tree-filter'는 매우 느리지 만 따옴표로 묶인 추천이 작동해야합니다. 'filter-branch'에서'rm'뿐만 아니라 실제로'git rm'을 사용하는 것처럼 보입니다.원치 않는 파일을 제거하는 훨씬 더 빠른 방법은 "the BFG"(해당 이름 검색)를 사용하는 것입니다. 그러나 그것은 어떤 필터 - 브랜치와 같은 문제를 가지고있다 : "나쁜"파일 이후와 적어도 모든 부분을 원래의 커밋과 더 이상 호환되지 않는 새로운 커밋에 복사해야하고 * 모든 사람 *이를 수용하도록 변경해야합니다. – torek

답변

2

filter-branch의 "문제"는 이미 푸시 된 커밋의 기록을 수정하는 명령과 같습니다. 만약 누군가 다른 사람이 이미이 커밋을 가지고 그것을 기반으로하는 지사를 가지고 있다면 그는 git rebase이라는 제목으로 RECOVERING FROM UPSTREAM REBASE이라는 제목으로 수동으로 자신의 히스토리 (즉, 다른 하나는 수동으로)를 고쳐야 할 것입니다.

히스토리에서 파일을 제거하려는 경우 e. 지. 비밀번호와 같은 기밀 정보가 포함되어있는 경우 어떤 도구를 사용하든 기록을 수정하는 것 이외의 다른 방법은 없습니다 git rebase -i, git filter-branch 또는 BFG이라고하는 도구를 사용하십시오.

filter-branch으로 각 커밋에 대해 전체 작업 트리가 필요하므로 --tree-filter을 사용하지 않아야합니다. 일부 파일을 추가하거나 변경하려는 경우 필요합니다. 파일을 삭제하는 경우에만 --index-filter을 사용해야하며 사용할 수없는 작업 트리가 아닌 색인에서만 작업해야합니다. 필터 명령은 --index-filter 'git rm --cached --ignore-unmatch "npz, species_coex.npz"'과 같습니다.

당신이 당신의 시도에있어 오류는 필터 명령에 rm ...하지만 git rm ...를 사용하지만,하지 않은 것을 의미한다과 유사한 존재하지 않는 파일을 삭제하려고하면 그것을 무시하고 자식을 알려주는 --ignore-unmatch없이 어떤 -f을 다른 것들 사이에 정상적인 rm 유틸리티 않습니다.

일부 파일을 다시 추가 한 경우 대화 형 리베이스를 사용하는 것이 더 쉽고 빠를 수도 있습니다. git rebase -i <the commit before the one that added the file>을 실행 한 다음 편집기에서 파일을 추가 한 커밋에 대해 스탠자를 edit으로 변경하고 편집기를 종료하십시오. Git이 멈 추면 git rm 'npz, species_coex.npz' && git commit --amend -C HEAD과 같이 현재 커밋에서 파일을 삭제하고 git rebase --continue으로 리베이스를 계속한다. 망할 놈이 끝난 후에는 파일없이 히스토리의 새로운 버전을 가져야한다.

+0

도움을 주셔서 감사합니다하지만 아무 도움도 : git filter-branch --index-filter 'git rm ...'라고 입력하면 치명적입니다 : 모호한 인수 'rm': 알 수없는 리비전 또는 경로가 작업 트리에 없습니다. . 그래서 정상적인 rm을 시도했지만 사용법 : git filter-branch ...라고 쓰고 filter branch 명령을 사용하는 방법을 설명합니다. 두 번째 옵션은 작동하지 않습니다./할 일을 모릅니다. 모든 파일 중 첫 번째 파일이므로이 파일을 추가 했으므로 체크 아웃해야 할 항목이 무엇인지 잘 모릅니다. –

+0

고마워, 지금은 모든 일을했다. (단지 git rebase - root를해야만한다.) –

+0

예, 변경해야하는 첫 번째 커밋이면,'rebase'는 업스트림 커밋 대신에'--root'가 필요합니다. 그러나'filter-branch' 역시 효과가 있었을 것입니다. '--index-filter'에 worktree가 없으므로 'rm'이 아니라, 'Answer'에서 설명했듯이 'rm'으로 파일을 삭제할 수 없기 때문입니다. 그러나'git rm --cached --ignore-unmatch "npz와 함께, species_coex.npz"는 효과가있었습니다. 당신이 잘못한 것을 당신에게 말해주기 위해 완전한 명령을 볼 필요가 있습니다. – Vampire

관련 문제