2016-12-22 4 views
0

Git 내역의 다른 모든 파일 중에서 몇 가지 "흥미로운"파일을 가지고 있습니다. 그리고 나는이 repo의 역사에있는 다른 어떤 파일도 존재하지 않고, Git repo로서 그들의 역사가있는 "흥미로운"파일만을 게시하려고합니다.모든 Git 커밋에서 선택된 파일을 제외한 모든 파일을 제거합니다.

git filter-branch --index-filter에 대한 스마트 스크립트 작성 방법은 무엇입니까? (. 또는 적어도이 느립니다, 나의 구원 나무가 거대한 때문에, 그러나 바람직하지 않다 git filter-branch --tree-filter에 대한) 내 질문이 가장 일반적인 비슷한 일명에 약간 다릅니다

12을 요구하고있다 : Git 기록에서 특정 ("민감한") 파일을 제거하는 방법은 무엇입니까? 보체를 제거하고 특정 파일을 보관해야합니다.

답변

0

따라서이 스크립트의 git filter-branch --index-filter에 대한 까다로운 부분은 색인에서 파일 목록을 가져 와서 특정 목록을 필터링 한 다음 결과 목록을 제거하는 것입니다.

별도의 실행 스크립트로 구현했습니다. git-update-index-keeping-only; 다시 명령을 호출하라고하지 않으면 내가 파일 이름에 줄 바꿈과 공간에 일어날 일에 대해 많이 생각하지 않은

git ls-files --full-name \ 
| fgrep -v -x -f <(echo "$FILELIST") \ 
| xargs git rm --cached "[email protected]" -- 

은 (공간, xargs 문제가 될해야합니다 여기에 거친 구현은 각 논쟁, 나는 효율성을 위해하지 않았다).

샘플 사용법은 나의 사용 사례에 유용한 또 다른 스크립트로 작성되었습니다. 재미있는 목록을 2 커밋 (예 : "업스트림"커밋과 마지막 커밋) 사이의 diff에서 수정되거나 추가 된 것으로 가져옵니다. 그).

그것은이다 git-filter-only-files-modified-since; 그 본질은 다음과 같습니다 :

FILES="$(git diff-tree "$SINCE": HEAD: \ 
    -r --name-only --diff-filter=MACRT)" 
export FILES 
git filter-branch \ 
    --index-filter 'echo "$FILES" | git-update-index-keeping-only -q' 
관련 문제