As imagens devem ser armazenadas em um repositório git?

201

Para uma equipe distribuída que usa Git e Github como controle de versão, as imagens também devem ser armazenadas no repositório git?

Na maior parte, as imagens não serão alteradas. A pasta que os contém aumentará de tamanho à medida que as imagens forem adicionadas. Uma preocupação é que a pasta de imagens possa crescer para um tamanho grande ao longo do tempo pela combinação de imagens grandes, ou apenas muitas delas.

Isso é considerado uma prática recomendada? Que outras alternativas existem para compartilhar arquivos binários necessários em projetos que uma equipe distribuída pode acessar facilmente?

esponja
fonte
17
Quando você diz "imagens", estamos falando de arquivos DSLR Raw de 26 MB, texturas de jogos 3D de 1 MB ou ícones <100k png? (Eu ia responder "depende" mas eu vou abster-se)
Brook
2
@Brook: Eu meio que assumi que estávamos falando de ícones ou pequenos elementos gráficos para sites. Texturas de jogos, arquivos brutos de design gráfico ou gráficos precisos para edição de documentação podem ser uma história diferente, você está certo.
haylem
6
Pessoalmente, pensei que ele quis dizer imagens ISO, não imagens.
Mahmoud Hossam
2
Deveria mesmo ser para imagens pequenas / médias para uso na web. Uma preocupação é que alguns dev-signers começarão a colar todas as grandes imagens originais, quando penso que provavelmente deveria usar outra coisa.
Spong
6
Lendo esta pergunta hoje? Veja a resposta abaixo no git lfs. Provavelmente é o que você quer. programmers.stackexchange.com/a/306882/92506
jonnybot

Respostas:

188

Suas imagens são originais ou podem ser recuperadas (garantidas?) De outros lugares? Eles são necessários para enviar uma unidade de software construída a partir da fonte? Se forem originais, precisam fazer backup. Coloque-os no seu controle de revisão, se eles nunca mudarem, a penalidade de espaço é a mesma que um backup e eles estão onde você precisa deles.

Eles podem ser editados para alterar a aparência do software, acidental ou intencionalmente? Sim - então eles DEVEM ser controlados por revisão de alguma forma, por que usar outra maneira quando você já tem uma solução perfeita. Por que introduzir o controle de versão "copiar e renomear" da idade das trevas?

Eu vi a arte original de um projeto inteiro ficar "maluca" quando o disco rígido do MacBook do designer gráfico morreu, tudo porque alguém, com infinita sabedoria, decidiu que "os binários não pertencem ao controle de rotação" e os designers gráficos (pelo menos este ) não costumam ser bons com backups.

O mesmo se aplica a todo e qualquer arquivo binário que atenda aos critérios acima.

O único motivo para não fazer isso é espaço em disco. Receio que, com US $ 100 / terabyte, essa desculpa esteja se esgotando um pouco.

mattnz
fonte
44
BTW: A Internet NÃO é uma fonte confiável. Se você baixou uma imagem de "bobsfreestuff.com", provavelmente ela não estará disponível na próxima semana.
mattnz
16
+1 - e deve ser + mais. O objetivo do controle de versão é permitir que você recupere / recupere as coisas, qualquer que seja a coisa, ALGUM TEMPO PASSADO. A única maneira de ser 100% que você pode recuperar o que deveria estar naquele momento é colocar tudo sob controle de versão. Isso é fonte, imagens, recursos, PDFs úteis / de suporte. Droga, eu até coloquei imagens de CD compactadas. Eu sou conhecido por colocar uma máquina virtual de VM (incluindo o VMDK) no controle de origem. Parece extremo? Salvo meu bacon 2 anos depois.
quickly_now
3
100% concorda. Se as imagens fazem parte do software, elas precisam ser controladas por revisão.
Dean Harding
14
A única razão pela qual eu discordaria seria se isso tornasse seu repositório complicado para clonar até o ponto em que os desenvolvedores realmente pensassem "eu realmente quero dedicar um tempo para clonar isso, ou posso apenas fazer X nesse outro ramo". Se isso ocorrer garantir que as coisas se re-organizados muito rapidamente
Brook
5
+1 no ponto sobre a necessidade de implantação. Se eu clonar seu repositório, porque sou um novo membro da equipe ou algo assim, ele deve funcionar imediatamente . Isso inclui ter um equivalente de makefile inteligente o suficiente para obter as bibliotecas de terceiros necessárias, se necessário.
Spencer Rathbun
66

Por que diabos não? :)

Armazenar binários é considerado uma prática ruim, sim, mas nunca me preocupei muito com imagens.

Na pior das hipóteses, se você tiver toneladas, armazene-as em outro lugar ou use fontes externas ou uma extensão para suporte binário. E se as imagens não forem alteradas com tanta frequência, qual é o problema? Você não terá um grande delta gordo. E se eles forem removidos com o tempo, apenas o servidor sofrerá um pouco de armazenamento do histórico, mas os clientes não verão nada.

Na minha opinião, você não deve se preocupar com isso - desde que você não armazene GBs desses.

O que você poderia fazer, porém, é apenas armazenar imagens "de origem": SVGs, macros LaTeX, etc ... e ter as imagens finais geradas pelo seu sistema de compilação. Provavelmente é ainda melhor, se você puder. Caso contrário, não se preocupe.

(Tudo isso dito, o Git brilha para arquivos de texto, mas não é o melhor VCS para imagens. Dê-nos mais contexto e métricas, se puder)


Para informações adicionais, convém consultar estas perguntas e respostas:

haylem
fonte
4
+1 para armazenar a fonte, mas se eles puderem fazer testes de desenvolvimento sem uma compilação completa, isso pode atrapalhar. Isso também significa que você precisa para construir todas as imagens antes de começar a trabalhar na parte da manhã
TheLQ
@TheLQ: Eu acho, mas talvez você deva ter builds em cascata, onde seus builds downstream (teste) só podem depender de builds upstream (a build real). E, em seguida, exporte-os para uma pasta pública para reutilização pelos testadores localmente. Isso implica um pouco de infraestrutura, obviamente, mas essa seria a minha maneira de fazer as coisas em uma equipe relativamente considerável.
precisa saber é
O que são binários?
precisa
1
@DantheMan: en.wikipedia.org/wiki/Binary_file
haylem
5
"Por que diabos não?" - porque se seu repo exceder 2 GB, o Bitbucket (e eu também tentei com o Github também) rejeitará seu repo. Portanto, esteja preparado para hospedar seus próprios repositórios, se você os encher de toneladas de imagens.
Jez
48

Essa pergunta é bastante antiga, mas é uma pergunta comum que surge quando se lida com o Git e há algum progresso em soluções modernas para armazenar arquivos grandes em um repositório Git desde a última resposta.

Para armazenar arquivos grandes no Git, existem os seguintes projetos:

  • git-anexo - Isso já existe há algum tempo, mas, francamente, a complexidade atrapalha.
  • git-media - Nenhuma experiência pessoal com este. Parece bastante complexo também.
  • git-fit - Uma tentativa de criar um plugin mais simples. Requer armazenamento S3. Embora eu aprecie a simplicidade, minha principal preocupação com o plug-in é que ele é bastante desconhecido e mantido por 1 indivíduo (divulgação completa, eu sou o único outro colaborador no momento e foi por um problema trivial).
  • git-lfs - Embora eu não tenha usado isso extensivamente, parece ser o Santo Graal. É apoiado pelo Github e está disponível em todos os seus repositórios a partir de outubro de 2015 e coloca a complexidade do gerenciamento de arquivos no local, armazenando seus repositórios. A única desvantagem é que isso é relativamente novo; portanto, além do Github, não há muito suporte, embora o Gitlab também tenha suporte , assim como o Gitea , e o Bitbucket aludiu ao suporte no futuro .

TLDR: se possível, use git-lfs para armazenar imagens ou outros arquivos binários no git.

James McMahon
fonte
9
Pela primeira vez em muito tempo, estou tão feliz que rolei para baixo para ler as respostas com menos votos. O git lfs é exatamente o que eu quero, e o Atlassian está adicionando suporte ao BitBucket Server ! Se eu pudesse votar isso um milhão de vezes, eu faria.
jonnybot
7
@jonnybot, obrigado. Eu era uma resposta tardia, então não obtive muita visibilidade, mas depois de usar o git-lfs, acho que é a melhor solução atual para armazenar arquivos binários no git.
James McMahon
45

O conjunto "não armazena binários no controle de origem" é definido por um motivo específico: Se você tiver um código-fonte que seja compilado, não armazene a compilação real, mas apenas o código-fonte. As imagens e os recursos visuais não têm uma "fonte", portanto devem ser rastreados no controle de versão.

Jason T Featheringham
fonte
4
Às vezes, os recursos visuais têm "algo como uma fonte" e, em seguida, é uma boa idéia automatizar o processo de criação da saída final e armazenar apenas a fonte no controle de versão. Exemplos: versões gráficas de varredura feitas a partir de arquivos SVG, ativos do site cortados de uma folha de sprite.
21418 tanius
Correto, esse é um argumento inteiramente justo.
Jason T Featheringham
21

Acredito que a maneira recomendada com o Git é usar um submódulo (introduzido no Git 1.5.3) que é basicamente um repositório separado que está associado ao principal. Você armazena suas imagens (e outros ativos binários) no submódulo. Isso pode ser verificado com o repositório principal ou deixado, dependendo do que for necessário.

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

"O suporte ao submódulo do Git permite que um repositório contenha, como subdiretório, uma verificação de um projeto externo. Os submódulos mantêm sua própria identidade; o suporte ao submódulo apenas armazena o local do repositório do submódulo e confirma o ID, assim outros desenvolvedores que clonam o projeto que os contém (" superproject ") pode facilmente clonar todos os submódulos na mesma revisão. É possível fazer check-outs parciais do superprojeto: você pode dizer ao Git para clonar nenhum, alguns ou todos os submódulos."

Além disso, o tamanho não deve ser um problema significativo se as imagens não mudarem com frequência. Você também pode executar comandos para remover / reduzir o tamanho, como:

git gc
git gc-aggressive
git prune
Dan Diplo
fonte
7

Sim .

Digamos que você libere a versão 1.0 do software. Para a versão 2.0, você decide refazer todas as imagens para ficar com sombras. Então você faz isso e lança o 2.0. Alguns clientes que estão usando 1.0 e não podem atualizar para 2.0 decidem que desejam o programa em outro idioma. Eles lhe dão US $ 1G para fazê-lo, então você tem certeza. Mas em uma cultura diferente, algumas de suas fotos não fazem sentido, então você precisa alterá-las ...

Se você mantiver suas imagens no controle de origem, isso é fácil, com base na versão 1.0, você faz alterações nas imagens (entre outras coisas), constrói, libera. Se você não os tivesse no controle de origem, teria muito mais dificuldade, pois precisaria encontrar as imagens antigas, alterá-las e depois compilar.

earlNameless
fonte
7

Se faz parte do projeto, deve estar no VCS . Como conseguir isso da melhor maneira pode depender do VCS ou como você organiza um projeto. Talvez um repositório para os designers, e apenas os resultados no repositório do codificador, ou apenas as 'Fontes de imagem' (eu já tive um projeto com apenas um arquivo .svg e as imagens foram geradas via make / inscape cli).

Mas, se um VCS não puder lidar com isso ou se tornar inútil, eu diria que não é a ferramenta certa para o seu trabalho.

Até agora, não tive problemas em colocar quantidades 'habituais' de gráficos (maquetes, conceitos e gráficos de página) para projetos da Web no git.

keppla
fonte
5

Você deve armazenar suas imagens no SCM: sim. Sem nenhuma dúvida.

Você deve armazenar suas imagens no git: isso fica mais complicado.

O git é muito bom com arquivos de texto, mas por sua própria natureza não é muito quente com binários. Você terá problemas com o tamanho dos dados transferidos ao clonar ou enviar por push, seus diretórios .git crescerão e você poderá ter uma confusão com a fusão (ou seja, como você mescla 2 imagens!)

Uma resposta é usar submódulos, pois isso significa que o vínculo entre seu projeto e as imagens será mais fraco - para que você não precise gerenciá-las como se elas fizessem parte da sua fonte, mantendo-as ainda controladas e não tendo se preocupa em ramificá-los - supondo que o subprojeto seja apenas um repositório "simples" de dados que não passa pela mesma rotatividade durante o processo de desenvolvimento usual.

A outra resposta é colocá-los em um projeto diferente, nunca ramificá-lo e garantir que todos os que se comprometam com esse projeto o empurram imediatamente para cima - nunca permita que duas pessoas alterem a mesma versão do arquivo - você achará o mais difícil aspecto como o git não foi projetado para um fluxo de trabalho não distribuído. Você precisará usar métodos de comunicação antiquados para seguir essa regra.

Uma terceira resposta é colocá-los em um SCM completamente diferente, mais voltado para o trabalho com imagens.

gbjbaanb
fonte
0

Adicionando à resposta de @ haylem, observe que o tamanho é um fator importante nisso. Dependendo do VCS, pode não funcionar bem com toneladas de imagens. Quando clones ou push grandes começam a demorar a noite toda, é realmente tarde demais, pois todas as imagens já estão no seu repositório.

Planeje fotos grandes e crescimento futuro. Você não quer entrar dois anos nesse projeto e ter uma "ah merda, talvez o repo seja um pouco grande demais ".

TheLQ
fonte
1
Sua resposta é um tanto irrelevante, pois a pergunta é específica ao git. Você sabe se o tamanho representa um fator grande (ou algum) para os repositórios git?
yannis
@Yannis deve, perdeu essa primeira frase ... AFAIK, git é melhor com repositórios maiores, mas a questão tamanho ainda é relevante como clones gigantescas ou empurrões são um problema
TheLQ
Com o GIT é trivialmente fácil reorganizar repositórios e criar clones parciais, etc., se isso se tornar um problema. Não confunda o melaço histórico das ferramentas de controle de revisão de décadas atrás com o de hoje.
mattnz
0

Definitivamente, concordo que é possível armazená-los técnica e economicamente. Pergunta que eu faria como é "essas imagens fazem parte do produto de remessa ou parte do conteúdo de um produto de remessa?" Não que você não possa armazenar conteúdo no GIT (ou em qualquer outro VCS), mas que é um problema separado para um VCS separado.

Wyatt Barnett
fonte