git은 zip 파일을 디렉토리로, zip 내부의 파일을 blob으로 처리 할 수 있 있습니까?
시나리오
항상 .zip
파일 안에 저장되어있는 일부 파일로 작업해야 할 상상해 . zip 내의 일부 파일은 작은 텍스트 파일이며 자주 변경되는 반면 다른 파일은 더 크지 만 운 좋게도 다소 정적입니다 (예 : 이미지).
이 zip 파일을 git
저장소에 배치 할 각 zip이 blob으로 처리 처리 저장소를 커밋 할 때마다 zip 파일의 크기가 커집니다. 내부의 작은 텍스트 파일이 하나만 변경 되더라도!
이것이 현실적인 이유
MS Word 2007/2010 .docx
및 Excel .xlsx
파일은 ZIP 파일입니다 ...
내가 원하는 것
혹시 git
zip을 파일로 처리하지 않고 디렉토리로 처리하고 내용을 파일로 처리 하는 지시하는 방법이 있습니까?
이점들
- 훨씬 작은 저장소 크기, 즉 빠른 전송 / 백업
- Git에서 zip으로 변경 하면 자동으로 작동합니다.
하지만 작동하지 않는다 고요?
추가 메타 데이터가 보관 git checkout
될 수 있습니다 . git foo.zip/bar.txt
에서는 일반 디렉터리에 파일 로 만들지 zip 파일 로 만들지 결정해야 합니다. 인스트루먼트는 구성 옵션을 통해 믿을 수 있습니다.
어떻게 할 수 있는지 두 가지 아이디어 (아직 존재하지 않는 경우)
- git 과 같은
minizip
또는IO::Compress::Zip
내부 라이브러리 사용 - 어떻게 든 파일 시스템 레이어를 추가하여 git이 실제로 zip 파일을 디렉토리에 저장합니다.
이것은 프레임 워크에 쉽게 존재하지 않습니다. git이 diff를 수행 할 때 바이너리 또는 ascii 파일을 표시하는 것과 다르게 작동하는 것처럼 구성 인터페이스를 통해 특정 파일 유형에 특별한 처리를 제공하도록 지시 할 수 있습니다.
코드베이스를 변경하고 싶지 않다면 (이것이 멋진 아이디어이지만), 사전 커밋 및 사후 체크 아웃 후크 를 사용하여 파일의 압축을 풀고 저장 하여 직접 펼쳐를 있습니다. 그런 다음 결제시 .zip 상태로 되돌립니다. 에 지정된 파일 blob / 강화로만 작업을 제한해야합니다 git add
.
어느 쪽이든 약간의 작업입니다. 다른 git 칭찬이 무슨 일이 일어나고 있는지 잘 알고 있는지에 대한 질문입니다.
이 질문에 여전히 관심이 있는지 확실하지 않습니다. 나는 같은 문제에 직면하고 있으며 여기에 git 파일 필터를 사용하는 솔루션이 있습니다.
편집 : 첫째, 나는 그것이 취소 명시하지 않을 수 있습니다, 그러나 이것은 IS 영업의 질문에 대한 답변! 댓글을 달기 전에 전체 문장을 기사 님. 또한 솔루션을위한 조언에 대해 @Toon Krijthe에게 감사드립니다.
내 해결은 필터를 사용하여 zip 파일을 모 놀리 식 확장 (거대 할 수 있음) 텍스트 파일로 "플랫"하는 것입니다. git add / commit 중에 zip 파일은 일반 텍스트 비교를 위해이 텍스트 형식으로 자동 확장 체크 아웃 자동으로 다시 압축됩니다.
텍스트 파일은 레코드로 구성되고 각 레코드는 zip 파일을 나타냅니다. 따라서이 텍스트 파일은 원본 zip에 대한 텍스트 기반 이미지라는 것을 알 수 있습니다. zip 파일이 텍스트 인 경우 텍스트 파일로 복사됩니다. 서식 텍스트 형식 파일로 복사하기 전에 base64로 인코딩됩니다. 이렇게하면 텍스트 파일이 항상 텍스트 파일로 유지됩니다.
이 필터는 zip의 각 파일을 blob으로 만들지는 않지만 텍스트 파일은 diff의 단위 인 한 줄로 매핑되는 반면 이진 파일 내용은 해당 base64의 업데이트로 수 있습니다. OP가 상상하는 것.
자세한 내용과 링크 타이핑 코드는 다음 내용과 링크를 참조하세요.
또한이 솔루션에 대해 저에게 영감을 준 장소에 감사드립니다. 파일 필터 작동 방식에 대한 설명
사용(자세한 내용은 GitMinutes # 24에 표시됨)
이는 대용량 (매우 매우 큰) 파일 을 처리하는 유일한 git-like 시스템입니다. 즉, zip 파일의 모든 버전은 전체 추가 사본이 아닌 델타에서 저장소 만 증가 수정됩니다.
결과는 일반 Git 명령이 읽을 수있는 실제 git repo입니다.
bup
" git with large files " 에서 Git과 어떻게 다른지 자세히 설명합니다 .
다른 해결 방법 (예 :)은 " 대용량 파일 사용 "에 대해 자세히 설명 된대로 완전히 만족 스럽습니다 .git-annex
git-annex
http://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/
(참고 : Ruben의 의견에 따라 압축이 풀린을 커밋하는 것이 아니라 의견을 전달합니다.)
~ / .gitconfig 파일을 (아직없는 경우 생성) 다음 스탠 튼튼합니다.
[diff "zip"] textconv = unzip -c -a
"unzip -c -a FILENAME"을 사용하여 zip 파일을 ASCII 텍스트로 변환하는 것입니다 (unzip -c는 STDOUT으로 압축을 풀니 다). 다음으로 REPOSITORY / .gitattributes 파일을 생성 / 수정하고 다음을 추가합니다.
* .pptx diff = zip
이 주어진 마스크 (이 경우 .pptx로 끝나는 모든 파일)에 대해 config의 zip-diffing 설명을 사용하도록 지시합니다. 이제 git diff는 자동으로 파일의 압축을 풀고 "바이너리 파일이 파일이"보다 조금 더 나은 ASCII 출력을 diff합니다. 다른 한편으로 pptx 파일의 해당 XML이 복잡하게 얽혀 점은 별 도움이되지 않지만 텍스트가 포함되어 있습니다. ZIP 파일 (: 소스 코드 아카이브)의 경우 실제로 매우 편리합니다.
파일 시스템에 zip 파일을 마운트해야 생각합니다. 나는 그것을 사용하지 않습니다. FUSE를 고려하십시오.
http://code.google.com/p/fuse-zip/
Windows 및 Linux 용 ZFS도 있습니다.
http://users.telenet.be/tfautre/softdev/zfs/
zip 압축 방법과 파일 순서가 종종 선택한 파일이 예상하기 때문에 응용 프로그램을 미리 압축 한 파일에 문제가 있습니다. 오픈 오피스 .odf 파일에 그 문제가 존재한다고 생각합니다.
any-old-zip을 보관하는 방법으로 사용하는 경우 필요할 때 압축을 풀고 다시 압축하는 몇 가지 간단한 내용을 만들 수 있습니다. 최신 Msysgit (일명 Windows 용 Git)은 이제 셸 코드 측에 zip 및 압축 해제 기능이 있으므로 사용할 수 있습니다.
현재 작업중 인 프로젝트는 zip을 기본 로컬 버전 제어 / 아카이브로 사용하는 수백 개의 zip을 git에 빠는 데 사용할 수있는 집합을 가져 오려고합니다 (그리고 다시 가져 오기 ;-). 동료들이 행복하다는 것을 의미합니다.
Zippey by sippey 와 유사한 Rezip 을 사용하면 git을 사용하여 ZIP 파일을 더 멋지게 처리 할 수 있습니다.
작동 원리
ZIP 기반 파일을 추가 / 커밋 할 때 Rezip은 인덱스 / 커밋에 추가하기 전에 압축을 풀고 다시 압축합니다. 압축되지 않은 ZIP 파일에서 보관 된 파일 은 콘텐츠에있는 그대로 표시 됩니다 (각 파일 앞에 일부 바이너리 메타 정보와 함께). 보관 된 파일이 일반 텍스트 파일 인 경우이 방법은 git에서 잘 작동합니다.
혜택
Zippey에 비해 Rezip의 주요 이점은 저장소에 저장된 실제 파일이 여전히 ZIP 파일이라는 것입니다. 따라서, 대부분의 경우, 이는 작동 그대로 (예 오픈 오피스) 각각의 응용 프로그램이 재 포장-와 압축 필터를 거치지 않고 얻을 수있다하더라도.
사용하는 방법
시스템에 필터를 설치하십시오.
mkdir -p ~/bin
cd ~/bin
# Download the filer executable
wget https://github.com/costerwi/rezip/blob/master/Rezip.class
# Install the add/commit filter
git config --global --replace-all filter.rezip.clean "java -cp ~/bin Rezip --store"
# (optionally) Install the checkout filter
git config --global --add filter.rezip.smudge "java -cp ~/bin Rezip"
<repo-root>/.gitattributes
파일에 다음과 같은 행을 추가하여 저장소에서 필터를 사용하십시오 .
[attr]textual diff merge text
[attr]rezip filter=rezip textual
# MS Office
*.docx rezip
*.xlsx rezip
*.pptx rezip
# OpenOffice
*.odt rezip
*.ods rezip
*.odp rezip
# Misc
*.mcdx rezip
*.slx rezip
textual
부분은이 파일이 실제로 차이점에 텍스트 파일로 표시되도록합니다.
'ProgramingTip' 카테고리의 다른 글
PHP 변수 보간과 연결 (0) | 2020.11.25 |
---|---|
Objective-C에서 IBInspectable의 주소를 설정하는 방법은 무엇입니까? (0) | 2020.11.25 |
C 표준 라이브러리와 C POSIX 라이브러리의 차이점 (0) | 2020.11.25 |
Java에 SoftHashMap이 있습니까? (0) | 2020.11.25 |
Excel 스프레드 시트 열을 SQL Server 데이터베이스로 가져 오기 (0) | 2020.11.24 |