Um clone / push / pull git espelha o conteúdo exato dos repositórios envolvidos?

9

Eu não sabia como escrever a pergunta, então peço desculpas se não estiver claro. Se você git clone um repo que tinha um monte de objetos pendentes, você clona esses? O mesmo para o oposto. Se você fez um git gc e o empurrou para outra pessoa, o repo deles perderá algo que o git gc teria limpado?

Eu acho que nenhum desses ocorreria, mas não consigo encontrar nenhuma documentação sobre esse cenário.

Encontrei algumas informações que parecem indicar que, com a maioria dos protocolos, git clone oferece um repositório limpo mas se você especificar o arquivo usando um caminho de arquivo, copia tudo.

The main reason to specify the file:// prefix is if you want a clean copy of the
repository with extraneous references or objects left out.
    
por Andy 28.07.2011 в 22:14
fonte

1 resposta

5

O clone do Git não clona objetos pendentes.

E o seu git gc não afetará de forma alguma o repositório remoto quando você o enviar, a menos que o envio cause objetos pendentes e, em seguida, um git gc seja executado no remoto para removê-los.

A menos que ...

Era um clone compartilhado (especificado com o sinal --shared ou -s ) ou um clone local ( --local ou -l ). Dos documentos:

  

-l

     

Quando o repositório para clonar está em uma máquina local, esse sinalizador   ignora o mecanismo de transporte normal "git aware" e clona o   repositório fazendo uma cópia de HEAD e tudo sob objetos e   refs diretórios . Os arquivos sob o diretório .git / objects / são   Hardlinked para economizar espaço quando possível. Este é agora o padrão quando   o repositório de origem é especificado com a sintaxe / path / to / repo,   essencialmente é uma opção não operacional. Para forçar a cópia em vez de hardlinking   (o que pode ser desejável se você está tentando fazer um backup do seu   repositório), mas ainda assim evitar o transporte usual "git aware"   mecanismo, --no-hardlinks podem ser usados.

     

-s

     

Quando o repositório a ser clonado está na máquina local, em vez de   usando hard links, configure automaticamente .git / objects / info / alternates para   compartilhar os objetos com o repositório de origem. O repositório resultante   começa sem nenhum objeto próprio.

     

NOTA: esta é uma operação possivelmente perigosa; não use a menos que   Você entende o que faz. Se você clonar seu repositório usando este   opção e , em seguida, excluir ramos (ou usar qualquer outro comando git que   torna qualquer commit existente não referenciada) no repositório de origem,   objetos podem se tornar não referenciados (ou pendurados). Esses objetos podem ser   removido por operações git normais (como git commit) que   chamar automaticamente git gc --auto .

Portanto, quando você faz um git clone /path/to/repo , está copiando os objetos (ou criando hardlinks) e, nesse caso, obterá o objeto pendente. Em outros casos (usando protocolos git, ssh, protocolo de arquivos, etc.), você nunca obterá os objetos pendentes no clone.

Procure aqui como o transporte acontece - link

    
por manojlds 28.07.2011 / 22:24
fonte