Git

Clone Git Shallow e Profundidade do Clone

Clone Git Shallow e Profundidade do Clone

Compreendendo o clone superficial do Git e a profundidade do clone

Git é um sistema de controle de versão distribuído. Essa é uma das vantagens de usar Git. Você não precisa depender de um servidor ou repositório central para trabalhar localmente. Tudo o que você precisa em relação ao histórico de seus módulos está ao seu alcance. No entanto, pode se tornar um problema quando você está lidando com repositórios com grandes arquivos binários ou repositórios que têm um longo histórico. Especialmente se você tiver uma situação em que precisa fazer o download sempre novo, como um servidor de compilação, o tamanho e os tempos de download podem se tornar um problema.

A solução do Git para o problema é o clone raso, onde você pode usar a profundidade do clone para definir a que profundidade seu clone deve ir. Por exemplo, se você usar -depth 1, durante a clonagem, o Git obterá apenas a cópia mais recente dos arquivos relevantes. Isso pode economizar muito espaço e tempo.

Clone e tamanho raso do Git

Vamos dar uma olhada no popular repositório Git para Django. Se você clonar totalmente o repo, obterá o seguinte:

$ git clone https: // github.com / django / django.idiota
Clonando em 'django' ..
remoto: contando objetos: 409053, concluído.
remoto: compactando objetos: 100% (26/26), concluído.
remoto: Total 409053 (delta 6), reutilizado 8 (delta 1), embalagem reutilizada 409026
Recebendo objetos: 100% (409053/409053), 167.77 MiB | 5.95 MiB / s, concluído.
Resolvendo deltas: 100% (297045/297045), concluído.
Verificando a conectividade ... concluído.
Retirando arquivos: 100% (5860/5860), concluído.

Agora, se você verificar o tamanho de sua cópia local, é:

$ du -sh django /
225M django /

Vamos obter o mesmo repositório Django com um clone superficial:

$ git clone --depth 1 https: // github.com / django / django.idiota
Clonando em 'django' ..
remoto: contando objetos: 8091, concluído.
remoto: compactando objetos: 100% (4995/4995), concluído.
remoto: Total 8091 (delta 2036), reutilizado 5507 (delta 1833), embalagem reutilizada 0
Recebendo objetos: 100% (8091/8091), 8.82 MiB | 3.29 MiB / s, concluído.
Resolvendo deltas: 100% (2036/2036), concluído.
Verificando a conectividade ... concluído.
Retirando arquivos: 100% (5860/5860), concluído.

Agora, se você verificar o tamanho da sua cópia local, deve ser significativamente menor:

$ du -sh django /
55M django /

Quando o seu servidor está lidando com centenas de linhas de produtos, este tipo de economia de espaço no disco rígido pode ser útil. Em casos de projetos de jogos onde há binários pesados, isso pode ter um efeito dramático. Também ajuda em projetos de longa data. Por exemplo, a clonagem completa do repositório Linux do GitHub tem mais de 7 GB, mas você pode cloná-lo superficialmente para menos de 1 GB.

Clone e história do Git Shallow

Você pode verificar localmente a clonagem superficial com seu próprio repositório. Vamos criar um arquivo em nosso repositório local, fazer alterações e confirmá-lo 10 vezes. E então podemos clonar o repositório:

$ mkdir _example
$ cd _example
$ ls
$ git init
Repositório Git vazio inicializado em / Users / zakh / git_repo / _example /.git /
$ echo x> large_file
$ git add -A
$ git commit -m "commit inicial"
[master (root-commit) dd11686] commit inicial
1 arquivo alterado, 1 inserção (+)
modo de criação 100644 large_file
$ echo xx> large_file
$ git add -A
$ git commit -m "Modificação para large_file 1"
[master 9efa367] Modificação para large_file 1
1 arquivo alterado, 1 inserção (+), 1 exclusão (-)


teste $ mkdir
teste de $ cd
$ git clone file: //// Users / zakh / git_repo / _example
Clonando em '_example' ..
remoto: contando objetos: 33, concluído.
remoto: compactando objetos: 100% (22/22), concluído.
remoto: Total 33 (delta 10), reutilizado 0 (delta 0)
Recebendo objetos: 100% (33/33), 50.03 MiB | 42.10 MiB / s, concluído.
Resolvendo deltas: 100% (10/10), concluído.
Verificando a conectividade ... concluído.

Neste exemplo, criamos o repositório git _example na pasta / Users / zakh / git_repo / com um único large_file. Apenas os dois primeiros commits são mostrados. Em seguida, estamos criando um clone completo desse repositório em um local diferente.

Então vamos verificar o histórico de nossos commits:

$ git log --oneline
7fa451f Modificação para large_file 10
648d8c9 Modificação para large_file 9
772547a Modificação para large_file 8
13dd9ab Modificação para large_file 7
5e73b67 Modificação para large_file 6
030a6e7 Modificação para large_file 5
1d14922 Modificação para large_file 4
bc0f2c2 Modificação para large_file 3
2794f11 Modificação para large_file 2
d4374fb Modificação para large_file 1
924829d Confirmação inicial

Vemos todos os commits no clone completo.
Agora vamos excluir a cópia atual e, em seguida, clone superficial com uma profundidade de 1:

$ git clone --depth 1 file: //// Users / zakh / git_repo / _example
Clonando em '_example' ..
remoto: Contando objetos: 3, concluído.
remoto: compactando objetos: 100% (2/2), concluído.
remoto: Total 3 (delta 0), reutilizado 0 (delta 0)
Recebendo objetos: 100% (3/3), 50.02 MiB | 65.12 MiB / s, concluído.
Verificando a conectividade ... concluído.

Se olharmos para o histórico agora, vemos apenas o último histórico de commits:

$ git log --oneline
7fa451f Modificação para large_file 10

Vamos clonar superficialmente com uma profundidade de 3:

$ git clone --depth 3 file: //// Users / zakh / git_repo / _example
Clonando em '_example' ..
remoto: Contando objetos: 9, concluído.
remoto: compactando objetos: 100% (6/6), concluído.
remoto: Total 9 (delta 2), reutilizado 0 (delta 0)
Recebendo objetos: 100% (9/9), 50.02 MiB | 65.15 MiB / s, concluído.
Resolvendo deltas: 100% (2/2), concluído.
Verificando a conectividade ... concluído.

Agora vemos mais commits:

$ git log --oneline
7fa451f Modificação para large_file 10
648d8c9 Modificação para large_file 9
772547a Modificação para large_file 8

Problemas com o clone Git Shallow

Os usuários devem entender que o tamanho e a economia de tempo de download dependem da organização dos commits. Eles podem diferir significativamente de um repositório para outro. É uma boa ideia testar o repositório com um clone raso para verificar quanto espaço no disco rígido e tempo de download você economizará.

Outra consideração é que, embora você possa enviar o código de um clone superficial, pode demorar mais por causa dos cálculos entre o servidor remoto e o local. Então, se você está enviando código regularmente a partir da cópia local, provavelmente faz sentido usar um clone completo.

Opção de múltiplas filiais

Quando você usa o sinalizador -depth com o comando clone, Git assume o sinalizador -single-branch por padrão. Mas você pode usar a sinalização -no-single-branch para dizer ao Git para obter históricos da profundidade especificada de cada branch.

Aqui estão os branches do Django sem a opção -no-single-branch (profundidade 1):

$ git branch -a
* mestre
remotes / origin / HEAD -> origin / master
controles remotos / origem / mestre

Apenas o branch master está presente.

Aqui estão os branches do Django após usar a opção -no-single-branch:

$ git clone --depth 1 --no-single-branch https: // github.com / django / django.idiota
Clonando em 'django' ..
remoto: contando objetos: 95072, concluído.
remoto: compactando objetos: 100% (42524/42524), concluído.
remoto: Total 95072 (delta 52343), reutilizado 82284 (delta 42389), embalagem reutilizada 0
Recebendo objetos: 100% (95072/95072), 74.69 MiB | 3.95 MiB / s, concluído.
Resolvendo deltas: 100% (52343/52343), concluído.
Verificando a conectividade ... concluído.
Retirando arquivos: 100% (5860/5860), concluído.
$ du -sh django
124M django

Observe que, embora a profundidade ainda seja 1, o tamanho do clone é 124M em vez dos 55M do caso anterior.
Se verificarmos os branches, veremos muito mais branches neste clone:

$ cd django
$ git branch -a
* mestre
remotes / origin / HEAD -> origin / master
controles remotos / origem / sótão / boulder-oracle-sprint
remotos / origem / sótão / história completa
remotes / origin / attic / generic-auth
controles remotos / origem / sótão / gis
controles remotos / origem / sótão / i18n
controles remotos / origem / sótão / remoção mágica
remotes / origem / sótão / multi-autenticação
remotes / origin / attic / multiple-db-support
remotes / origin / attic / new-admin
remotes / origin / attic / newforms-admin
remotes / origem / sótão / permissões por objeto
remotes / origin / attic / queryset-refactor
remotos / origem / sótão / evolução do esquema
remotes / origin / sótão / schema-evolution-ng
remotes / origin / attic / search-api
controles remotos / origem / sótão / sqlalchemy
remotes / origem / sótão / unicode
controles remotos / origem / mestre
remotes / origin / soc2009 / admin-ui
remotes / origin / soc2009 / http-wsgi-improvement
remotes / origin / soc2009 / i18n-improvement
remotes / origin / soc2009 / model-validation
remotes / origin / soc2009 / multidb
remotes / origin / soc2009 / test-improvement
remotes / origin / soc2010 / app-loading
remotes / origin / soc2010 / query-refactor
remotes / origin / soc2010 / test-refactor
controles remotos / origem / estável / 0.90.x
controles remotos / origem / estável / 0.91.x
controles remotos / origem / estável / 0.95.x
controles remotos / origem / estável / 0.96.x
controles remotos / origem / estável / 1.0.x
controles remotos / origem / estável / 1.1.x
controles remotos / origem / estável / 1.10.x
controles remotos / origem / estável / 1.11.x
controles remotos / origem / estável / 1.2.x
controles remotos / origem / estável / 1.3.x
controles remotos / origem / estável / 1.4.x
controles remotos / origem / estável / 1.5.x
controles remotos / origem / estável / 1.6.x
controles remotos / origem / estável / 1.7.x
controles remotos / origem / estável / 1.8.x
controles remotos / origem / estável / 1.9.x
controles remotos / origem / estável / 2.0.x

Resumo

O clone raso do Git pode ajudá-lo a economizar tempo e espaço no disco rígido. Mas tem um preço. Se você estiver enviando código regularmente para repositórios remotos, isso aumentará o tempo de confirmação. Portanto, para fluxos de trabalho regulares, é uma boa ideia evitar clones superficiais.

Referências:

Como alterar o ponteiro do mouse e tamanho do cursor, cor e esquema no Windows 10
O ponteiro do mouse e o cursor no Windows 10 são aspectos muito importantes do sistema operacional. Isso também pode ser dito para outros sistemas ope...
Mecanismos de jogos gratuitos e de código aberto para o desenvolvimento de jogos Linux
Este artigo cobrirá uma lista de mecanismos de jogo gratuitos e de código aberto que podem ser usados ​​para desenvolver jogos 2D e 3D no Linux. Exist...
Tutorial de Shadow of the Tomb Raider para Linux
Shadow of the Tomb Raider é a décima segunda adição à série Tomb Raider - uma franquia de jogos de ação e aventura criada pela Eidos Montreal. O jogo ...