이미지를 git 저장소에 저장해야합니까?


200

Git 및 Github를 버전 제어로 사용하는 분산 팀의 경우 이미지도 git 저장소에 저장해야합니까?

대부분의 경우 이미지는 변경되지 않습니다. 이미지가 추가되면 폴더가 포함 된 폴더의 크기 만 커집니다. 큰 이미지 또는 많은 이미지의 조합으로 인해 이미지 폴더가 시간이 지남에 따라 큰 크기로 커질 수 있습니다.

이것이 모범 사례로 간주됩니까? 분산 된 팀이 쉽게 액세스 할 수있는 프로젝트에 필요한 이진 파일을 공유하기위한 다른 대안은 무엇입니까?


17
"이미지"라고 말하면 26mb DSLR Raw 파일, 1mb 3d 게임 텍스처 또는 <100k png 아이콘에 대해 이야기하고 있습니까? (나는 "의지하다"라고 대답하려고했지만 자제 할 것이다)
Brook

2
@ 브룩 : 웹 사이트의 아이콘이나 작은 그래픽 요소를 말하는 것 같습니다. 게임 텍스처, 그래픽 디자인 원시 파일 또는 문서 편집을위한 정확한 그래픽은 다른 이야기 일 수 있습니다.
haylem

6
개인적으로 그는 그림이 아니라 ISO 이미지를 의미한다고 생각했습니다.
Mahmoud Hossam

2
웹에 적합한 중소형 이미지 여야합니다. 문제는 일부 개발자 서명자 가 다른 무언가를 사용해야한다고 생각할 때 모든 원본 이미지를 고집하기 시작한다는 것입니다.
spong

6
오늘이 질문을 읽고 있습니까? git lfs에서 아래 답변을보십시오. 아마 당신이 원하는 것입니다. programmers.stackexchange.com/a/306882/92506
jonnybot

답변:


188

이미지가 독창적으로 작동합니까 아니면 다른 곳에서 복구 (보증) 할 수 있습니까? 소스로 구축 된 소프트웨어 유닛을 배송해야합니까? 원본 인 경우 백업이 필요합니다. 변경하지 않으면 공간 페널티는 백업과 동일하며 필요한 곳에 있습니다.

실수로 또는 의도적으로 소프트웨어의 모양을 변경하도록 편집 할 수 있습니까? 예-그렇다면 어떻게 든 수정 제어해야합니다. 이미 완벽한 솔루션이있을 때 다른 방법을 사용해야하는 이유는 무엇입니까? 암흑기부터 "복사 및 이름 바꾸기"버전 제어를 도입하는 이유는 무엇입니까?

나는 그래픽 디자이너의 MacBook 하드 드라이브가 죽었을 때 전체 프로젝트의 원래 작품이 "가짜"가되는 것을 보았습니다. 그 이유는 무한한 지혜를 가진 누군가가 "이진은 rev 컨트롤에 속하지 않는다"고 그래픽 디자이너 (최소한 하나는이 작품은 아닙니다) )는 백업에 좋지 않은 경향이 있습니다.

위의 기준에 맞는 모든 바이너리 파일에도 동일하게 적용됩니다.

하지 않는 유일한 이유는 디스크 공간입니다. 나는 테라 바이트 당 $ 100가 무서워서, 그 변명은 약간 얇아지고있다.


44
BTW : 인터넷은 신뢰할 수있는 출처가 아닙니다. "bobsfreestuff.com"에서 이미지를 다운로드 한 경우 다음 주에는 없을 것입니다.
mattnz

16
+1-+ 더 있어야합니다. 버전 관리의 요점은 어떤 경우라도 어떤 시점에서든 복구 할 수 있도록하는 것입니다. 100 %가되는 유일한 방법은 모든 시점에서 모든 것을 버전 관리에 두어야하는 시점으로 되돌릴 수있는 유일한 방법입니다. 소스, 이미지, 리소스, PDF 지원 / 지원. 심지어 Zipped CD 이미지도 넣었습니다. VM 가상 머신 (VMDK 포함)을 소스 제어에 넣는 것으로 알려져 있습니다. 극단적 인 것 같아? 2 년 후 베이컨을 구했습니다.
quick_now

3
100 % 동의합니다. 이미지가 소프트웨어의 일부인 경우 이미지를 수정하여 제어해야합니다.
Dean Harding

14
내가 동의하지 않는 유일한 이유는 개발자가 실제로 "이것을 복제하는 데 시간이 걸리거나 다른 지점에서 X를 할 수 있습니까?" 이런 일이 발생하면 상황을 매우 빠르게 재구성하십시오
Brook

5
배포에 필요한 시점에 +1 내가 새로운 팀원이거나 다른 사람이기 때문에 레포를 복제 하면 즉시 사용할 수 있습니다. 여기에는 필요한 경우 필요한 타사 라이브러리를 얻을 수있는 makefile과 동등한 영리한 기능이 포함됩니다.
스펜서 Rathbun

66

왜 안돼? :)

바이너리를 저장하는 것은 나쁜 습관으로 간주되지만 이미지에 대해 너무 걱정하지 마십시오.

최악의 경우 톤이있는 경우 다른 곳에 저장하거나 외부 또는 바이너리 지원을위한 확장을 사용하십시오. 그리고 이미지가 자주 바뀌지 않는다면 문제는 어디에 있습니까? 뚱뚱한 델타를 얻지 못할 것입니다. 그리고 시간이 지남에 따라 제거되면 서버 만 기록을 저장하는 데 어려움을 겪지 만 클라이언트는 아무것도 볼 수 없습니다.

제 생각에는 GB를 저장하지 않기 때문에 걱정할 필요가 없습니다.

당신은 무엇을 할 수 있지만 일은, 단지 저장 "소스"이미지입니다 : 등 SVGs, 고무 매크로, ... 그리고 빌드 시스템에 의해 생성 된 최종 이미지를 가지고있다. 가능하다면 더 좋을 것입니다. 그렇지 않다면 귀찮게하지 마십시오.

(Git은 텍스트 파일에는 빛을 발하지만 사진에 가장 적합한 VCS는 아닙니다. 가능하면 더 많은 컨텍스트와 메트릭을 제공하십시오)


자세한 내용은 다음 Q & A를 참조하십시오.


4
소스를 저장하는 데는 +1이지만 전체 빌드없이 개발 테스트를 수행 할 수 있으면 소스를 엉망으로 만들 수 있습니다. 또한 아침에 작업을 시작하기 전에 모든 이미지를
만들어야

@ TheLQ : 추측하지만, 다운 스트림 (테스트) 빌드는 업스트림 빌드 (실제 빌드)에만 의존 할 수있는 계단식 빌드가 있어야합니다. 그런 다음 테스터가 로컬에서 재사용 할 수 있도록 공용 폴더로 내 보냅니다. 그것은 분명히 약간의 인프라를 의미하지만 상대적으로 규모가 큰 팀에서 일을하는 나의 방법이 될 것입니다.
haylem

바이너리는 무엇입니까?
Daniel Pendergast


5
"도대체 왜 안돼?" -리포지토리가 2GB를 초과하면 Bitbucket (및 방금 Github에서도 시도한 경우)이 리포지토리를 거부합니다. 따라서 수많은 이미지를 사용하여 자신의 저장소를 부 풀릴 수 있도록 준비하십시오.
Jez

48

이 질문은 꽤 오래되었지만 이것은 Git을 다룰 때 발생하는 일반적인 질문이며 마지막 답변 이후 Git 저장소에 큰 파일을 저장하는 현대적인 솔루션에 대한 진전이 있습니다.

Git에 큰 파일을 저장하기 위해 다음 프로젝트가 있습니다.

TLDR : 가능하다면 git-lfs 를 사용 하여 이미지 나 다른 바이너리 파일을 git에 저장하십시오.


9
오랫동안 처음으로, 나는 아래로 스크롤하여 투표가 적은 답변을 읽게되어 기쁩니다. git lfs는 정확히 내가 원하는 것이고 Atlassian은 심지어 BitBucket Server에 대한 지원을 추가하고 있습니다 ! 내가 이것을 백만 번 공표 할 수 있다면 나는 할 것입니다.
jonnybot

7
@jonnybot, 감사합니다. 나는 늦게 대답했기 때문에 많은 가시성을 얻지 못했지만 git-lfs를 직접 사용한 후에는 바이너리 파일을 git에 저장하는 가장 좋은 솔루션이라고 생각합니다.
James McMahon

45

전체 "소스 제어에 바이너리를 저장하지 마십시오"는 다음과 같은 특정 이유로 설명됩니다. 컴파일하는 소스 코드가있는 경우 실제 컴파일은 저장하지 말고 소스 코드 만 저장하십시오. 이미지 및 시각적 자산에는 "소스"가 없으므로 버전 관리에서 추적 해야 합니다.


4
때로는 시각적 자산에 "소스와 같은 것"이있는 경우 최종 출력을 만드는 프로세스를 자동화하고 소스를 버전 관리에만 저장하는 것이 좋습니다. 예 : SVG 파일로 만든 래스터 그래픽 버전, 웹 사이트 자산은 스프라이트 시트에서 잘라냅니다.
tanius

맞습니다, 그것은 전적으로 공정한 주장입니다.
Jason T Featheringham

21

Git의 권장 방법은 기본적으로 기본 모듈과 관련된 별도의 저장소 인 하위 모듈 (Git 1.5.3에서 도입 됨)을 사용하는 것입니다. 하위 모듈에 이미지 및 기타 이진 자산을 저장합니다. 그런 다음 기본 리포지토리에서 체크 아웃하거나 필요한 항목에 따라 남겨 둘 수 있습니다.

에서 http://book.git-scm.com/5_submodules.html

"깃의 서브 모듈 지원은 저장소가 외부 프로젝트의 체크 아웃을 서브 디렉토리로 포함 할 수있게한다. 서브 모듈은 자신의 고유성을 유지한다; 서브 모듈 지원은 서브 모듈 저장소 위치와 커밋 ID를 저장하기 때문에 포함하는 프로젝트를 복제하는 다른 개발자들 (" superproject ")를 사용하면 동일한 버전으로 모든 하위 모듈을 쉽게 복제 할 수 있습니다. 수퍼 프로젝트의 일부 체크 아웃이 가능합니다. Git에 하위 모듈 중 일부 또는 전부를 복제하지 않도록 지시 할 수 있습니다."

또한 이미지가 자주 바뀌지 않는 경우 크기는 큰 문제가되지 않습니다. 다음과 같이 크기를 제거 / 감소하는 명령을 실행할 수도 있습니다.

git gc
git gc-aggressive
git prune

7

.

소프트웨어 버전 1.0을 출시한다고 가정하겠습니다. 버전 2.0의 경우 모든 그림을 그림자와 함께 다시 실행하기로 결정했습니다. 따라서이 작업을 수행하고 2.0을 릴리스하십시오. 그런 다음 1.0을 사용하고 2.0으로 업그레이드 할 수없는 일부 고객은 다른 언어로 프로그램을 원한다고 결정합니다. 그들은 당신에게 그것을하기 위해 당신에게 $ 1G를 주므로, 당신은 확실히 말한다. 그러나 다른 문화권에서는 일부 그림이 이해가되지 않으므로 변경해야합니다 ...

이미지를 소스 제어 상태로 유지하려면 1.0을 기반으로 이미지를 변경하고 (빌드, 릴리스) 쉽게 수행 할 수 있습니다. 소스 컨트롤에 이러한 이미지가 없으면 이전 이미지를 찾아서 변경 한 다음 빌드해야하므로 시간이 훨씬 더 어려워집니다.


7

프로젝트의 일부인 경우 VCS에 있어야합니다 . 최선을 다하는 방법은 VCS 또는 프로젝트 구성 방법에 따라 달라질 수 있습니다. 아마도 디자이너를위한 리포지토리와 코더 리포지토리의 결과 또는 '이미지 소스'만 있습니다 (한 번 .svg 파일이있는 프로젝트와 make / inscape cli를 통해 생성 된 이미지가 있음).

그러나 VCS가 처리 할 수 ​​없거나 사용할 수 없게되면 작업에 적합한 도구가 아니라고 말할 수 있습니다.

지금까지 git의 웹 프로젝트에 '일반적인'양의 그래픽 (mockups, concepts 및 page graphics)을 넣는 데 아무런 문제가 없었습니다.


5

SCM에 이미지를 저장해야합니까? 의심없이.

git에 이미지를 저장하면 더 까다로워집니다.

git은 텍스트 파일에 매우 좋지만 본질적으로 바이너리로는 너무 뜨겁지 않습니다. 복제하거나 푸시 할 때 전송되는 데이터 크기에 문제가 있으며 .git 디렉토리가 커지고 병합으로 인해 혼란에 빠질 수 있습니다 (예 : 2 개의 이미지를 병합하는 방법!)

하나의 대답은 서브 모듈을 사용하는 것입니다. 이는 프로젝트와 이미지 사이의 링크가 약해 짐을 의미하므로 이미지를 소스의 일부인 것처럼 관리하지 않아도 이미지를 제어하면서 계속 관리 할 필요는 없습니다. 하위 프로젝트가 일반적인 개발 프로세스 동안 동일한 변동을 거치지 않는 '평평한'데이터 저장소라고 가정하면 분기에 대한 걱정.

다른 대답은 프로젝트를 다른 프로젝트에 배치하고 분기하지 말고 프로젝트에 참여하는 모든 사람이 즉시 업스트림으로 푸시하도록 보장하는 것입니다. 두 사람이 같은 버전의 파일을 변경하지 못하게하십시오. git as aspect는 비 분산 워크 플로우를 위해 설계되지 않았습니다. 이 규칙을 적용하려면 구식 통신 방법을 사용해야합니다.

세 번째 답변은 이미지 작업에 더 적합한 다른 SCM에 배치하는 것입니다.


0

@haylem의 대답에 덧붙여서 크기가 큰 영향을 미친다는 점에 유의하십시오. VCS에 따라 많은 이미지에서 제대로 작동하지 않을 수 있습니다. 클론이나 큰 푸시가 밤새 걸리기 시작하면 모든 이미지가 이미 저장소에 있으므로 너무 늦습니다.

큰 그림과 미래의 성장을 계획하십시오. 이 프로젝트에 2 년이 걸리지 않기를 원하며 "아마도, 레포가 너무 큽니다."


1
질문은 git에만 해당되므로 귀하의 답변은 다소 관련이 없습니다. 크기가 자식 리포지토리에 큰 영향을 미치는지 아십니까?
yannis 2016 년

@Yannis 놓칠야만 하느니라 첫 문장 ... AFAIK, 자식은 큰 저장소와 더 나은하지만 거대한 클론 또는 푸시가 문제이기 때문에 크기 문제가 여전히 관련
TheLQ

GIT를 사용하면 문제가 발생할 경우 리포지토리를 재배치하고 부분 복제본 등을 쉽게 만들 수 있습니다. 수십 년 전의 수정 제어 도구의 역사적 당밀을 오늘날의 수정과 혼동하지 마십시오.
mattnz

0

기술적으로 경제적으로 저장하는 것이 가능하다는 데 동의합니다. 질문 "이 이미지는 배송 제품의 일부 또는 배송 제품 내용의 일부입니까?" GIT (또는 다른 VCS)에 콘텐츠를 저장할 수는 없지만 별도의 VCS에 대해서는 별도의 문제입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.