색인에서 특정 유형의 파일을 모두 제거하려면 어떻게합니까? 나는힘내 - 색인에서 특정 유형의 파일 모두 제거
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
하나의 자식이 globs의 확장되지 않은 사용하고, 또는 내가 기대하고있어 방법에 **
확대되지 않습니다.
색인에서 특정 유형의 파일을 모두 제거하려면 어떻게합니까? 나는힘내 - 색인에서 특정 유형의 파일 모두 제거
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
하나의 자식이 globs의 확장되지 않은 사용하고, 또는 내가 기대하고있어 방법에 **
확대되지 않습니다.
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
작동해야하지만, 때문에 자식 globs와 (*
) 일치하는 경로 구분 조금 바보입니다. 따라서 **/*.jar
은 *.jar
과 같습니다.
이것은 또한 */a*.jar
이 dir1/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 glossary
의 pathspec
섹션을 참조하십시오.
당신은 단순히 인덱스에서 모든 병을 제거하기 위해이 작업을 실행해야합니다 :
git rm -r --cached **/*.jar
실행 프로젝트의 루트 디렉토리에서이 명령하고 정리하고 오직 모든 파일을 제거합니다 스테이징 영역에서.
무엇이'**'를 확장합니까? Bash (또는 다른 쉘) 또는 git? 'index-filter'는 코드를 체크 아웃하지 않기 때문에 bash 확장은 여기서 도움이되지 않습니다. –
제대로 이해했다면 자식 시스템에서'*'는 경로 구분자와 일치하므로'**'는 필요하지 않습니다. -o. ('git help glossary'의'pathspec'을보세요.) –
가 자식 명령 아니지만, 리눅스 시스템에서 그 작업을 수행하는 방법에 관심이있는 사람들을 위해, 당신은 자식의 인덱스에 여기
git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done }
우리는 모든 파일 목록을 사용할 수 있습니다 및 해당 출력을 전달하지만 grep 명령을 사용하여 .sh
개의 파일 만 필터링하고 각 파일보다 git rm --cached <file>
을 수행합니다.
내가 찾은 가장 쉬운 방법은 프로젝트 페이지의 지침이 명확하다 BFG Repo-Cleaner
을 사용하는 것입니다.
bfg --delete-files "*.jar" my-repo.git
BFG는 .jar 확장자로 끝나는 모든 파일의 REPO의 역사를 정리합니다 : 당신이 사용하는 것이이 명령은 같은 것입니다. 결과를 서버로 다시 보내기 전에 검사 할 수 있습니다.
색인에서 삭제 하시거나 repo를 만드시겠습니까? filter-branch가 repo를 "정리"합니다 – CodeWizard