ProgramingTip

git은 zip 파일을 디렉토리로, zip 내부의 파일을 blob으로 처리 할 수 ​​있 있습니까?

bestdevel 2020. 11. 25. 08:13
반응형

git은 zip 파일을 디렉토리로, zip 내부의 파일을 blob으로 처리 할 수 ​​있 있습니까?


시나리오

항상 .zip파일 안에 저장되어있는 일부 파일로 작업해야 할 상상해 . zip 내의 일부 파일은 작은 텍스트 파일이며 자주 변경되는 반면 다른 파일은 더 크지 만 운 좋게도 다소 정적입니다 (예 : 이미지).

이 zip 파일을 git저장소에 배치 할 각 zip이 blob으로 처리 처리 저장소를 커밋 할 때마다 zip 파일의 크기가 커집니다. 내부의 작은 텍스트 파일이 하나만 변경 되더라도!

이것이 현실적인 이유

MS Word 2007/2010 .docx및 Excel .xlsx파일은 ZIP 파일입니다 ...

내가 원하는 것

혹시 gitzip을 파일로 처리하지 않고 디렉토리로 처리하고 내용을 파일로 처리 하는 지시하는 방법이 있습니까?

이점들

하지만 작동하지 않는다 고요?

추가 메타 데이터가 보관 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가 상상하는 것.

자세한 내용과 링크 타이핑 코드는 다음 내용과 링크를 참조하세요.

Zippey Git 파일 필터

또한이 솔루션에 대해 저에게 영감을 준 장소에 감사드립니다. 파일 필터 작동 방식에 대한 설명


bup

사용(자세한 내용은 GitMinutes # 24에 표시됨)

이는 대용량 (매우 매우 큰) 파일 을 처리하는 유일한 git-like 시스템입니다. 즉, zip 파일의 모든 버전은 전체 추가 사본이 아닌 델타에서 저장소 만 증가 수정됩니다.

결과는 일반 Git 명령이 읽을 수있는 실제 git repo입니다.

bup" git with large files " 에서 Git과 어떻게 다른지 자세히 설명합니다 .


다른 해결 방법 (예 :)은 " 대용량 파일 사용 "에 대해 자세히 설명 된대로 완전히 만족 스럽습니다 .git-annexgit-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부분은이 파일이 실제로 차이점에 텍스트 파일로 표시되도록합니다.

참고 URL : https://stackoverflow.com/questions/8001663/can-git-treat-zip-files-as-directories-and-files-inside-the-zip-as-blobs

반응형