2016-08-10 5 views
2

색인에서 특정 유형의 파일을 모두 제거하려면 어떻게합니까? 나는힘내 - 색인에서 특정 유형의 파일 모두 제거

git filter-branch --index-filter 'git rm -rf --cached **/*.jar' 

하나의 자식이 globs의 확장되지 않은 사용하고, 또는 내가 기대하고있어 방법에 ** 확대되지 않습니다.

+0

색인에서 삭제 하시거나 repo를 만드시겠습니까? filter-branch가 repo를 "정리"합니다 – CodeWizard

답변

1
git filter-branch --index-filter 'git rm -rf --cached **/*.jar' 

작동해야하지만, 때문에 자식 globs와 (*) 일치하는 경로 구분 조금 바보입니다. 따라서 **/*.jar*.jar과 같습니다.

이것은 또한 */a*.jardir1/abc/dir2/log4j.jar과 일치 함을 의미합니다. **/a*.jar (모든 디렉토리의 이름이 a으로 시작하는 모든 항아리)과 일치 시키려면 find를 사용해야합니다. 여기 dir1/dir2에 이름이 a 또는 b로 시작하는 모든 항아리, 어떤 항아리를 제거하는 명령, 그리고 임의의 디렉토리에있는 .txt 파일 :

git filter-branch --index-filter 'git rm -rf --cached "*.txt" "dir1/dir2/*.jar" $(find -type f -name "a*.jar" -o -name "b*.jar")' 

참고 : git help glossarypathspec 섹션을 참조하십시오.

5

당신은 단순히 인덱스에서 모든 병을 제거하기 위해이 작업을 실행해야합니다 :

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

실행 프로젝트의 루트 디렉토리에서이 명령하고 정리하고 오직 모든 파일을 제거합니다 스테이징 영역에서.

+1

무엇이'**'를 확장합니까? Bash (또는 다른 쉘) 또는 git? 'index-filter'는 코드를 체크 아웃하지 않기 때문에 bash 확장은 여기서 도움이되지 않습니다. –

+0

제대로 이해했다면 자식 시스템에서'*'는 경로 구분자와 일치하므로'**'는 필요하지 않습니다. -o. ('git help glossary'의'pathspec'을보세요.) –

1

가 자식 명령 아니지만, 리눅스 시스템에서 그 작업을 수행하는 방법에 관심이있는 사람들을 위해, 당신은 자식의 인덱스에 여기

git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done } 

우리는 모든 파일 목록을 사용할 수 있습니다 및 해당 출력을 전달하지만 grep 명령을 사용하여 .sh 개의 파일 만 필터링하고 각 파일보다 git rm --cached <file>을 수행합니다.

2

내가 찾은 가장 쉬운 방법은 프로젝트 페이지의 지침이 명확하다 BFG Repo-Cleaner

을 사용하는 것입니다.

bfg --delete-files "*.jar" my-repo.git 

BFG는 .jar 확장자로 끝나는 모든 파일의 REPO의 역사를 정리합니다 : 당신이 사용하는 것이이 명령은 같은 것입니다. 결과를 서버로 다시 보내기 전에 검사 할 수 있습니다.