이를 수행하는 한 가지 방법은 그 반대입니다. 유지하려는 파일을 제외한 모든 것을 제거하십시오.
기본적으로 저장소 의 복사본 을 만든 다음을 사용 git filter-branch
하여 유지하려는 파일 / 폴더를 제외한 모든 항목을 제거합니다.
예를 들어, 파일 tvnamer.py
을 새 저장소 로 추출하려는 프로젝트가 있습니다 .
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
git filter-branch --tree-filter
각 커밋을 수행하고 명령을 실행하고 결과 디렉토리 콘텐츠를 다시 커밋 하는 데 사용 됩니다. 이것은 매우 파괴적이며 (따라서 리포지토리의 복사본에서만이 작업을 수행해야합니다!) 시간이 걸릴 수 있습니다 (300 개의 커밋과 약 20 개의 파일이있는 리포지토리에서 약 1 분).
위의 명령은 각 개정판에서 다음 셸 스크립트를 실행합니다. 물론 수정해야합니다 (대신 하위 디렉터리를 제외하려면 tvnamer.py
).
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
가장 분명한 문제는 남은 파일과 관련이 없더라도 모든 커밋 메시지를 남기는 것입니다. git-remove-empty-commits 스크립트 는 이것을 수정합니다.
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
(기본적으로 백업) 모든 항목과 함께 다시 -f
실행 되는 force 인수 를 사용해야합니다.filter-branch
refs/original/
예를 들어 커밋 메시지가 다른 파일을 언급하는 경우에는 물론 이것은 완벽하지 않을 것입니다.하지만 git current가 허용하는 정도에 가깝습니다 (어쨌든 내가 아는 한).
다시 말하지만, 저장소 사본에서만 이것을 실행하십시오! -그러나 요약하면 "thisismyfilename.txt"를 제외한 모든 파일을 제거합니다.
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'